1.SQL优化
- 避免使用OR
- 不要使用like '%xx' %在左边时索引失效
- 使用复合索引时没有遵循最左匹配原则
- 不要让数据类型出现隐式转化
- 不要在索引字段上使用not,<>,!=,一样会导致索引失效
- 分解关联查询
- 小表驱动大表 即小的数据集驱动大的数据集
2.事务级别调整
首先了解下事务的隔离级别,数据库共定义了四种隔离级别:
- Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
- Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)
- Read committed:可避免脏读情况发生(读已提交)。
- Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
可以通过 set transaction isolation level 设置事务隔离级别来提高性能
3.MySql配置参数
#基础配置 datadir=/data/datafile socket=/var/lib/mysql/mysql.sock log-error=/data/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid character_set_server=utf8#允许任意IP访问 bind-address = 0.0.0.0#是否支持符号链接,即数据库或表可以存储在my.cnf中指定datadir之外的分区或目录,为0不开启#symbolic-links=0#支持大小写 lower_case_table_names=1#二进制配置 server-id = 1 log-bin = /data/log/mysql-bin.log log-bin-index =/data/log/binlog.index log_bin_trust_function_creators=1 expire_logs_days=7 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION#InnoDB存储数据字典、内部数据结构的缓冲池,16MB已经足够大了。 innodb_additional_mem_pool_size = 16M#InnoDB用于缓存数据、索引、锁、插入缓冲、数据字典等#如果是专用的DB服务器,且以InnoDB引擎为主的场景,通常可设置物理内存的60%#如果是非专用DB服务器,可以先尝试设置成内存的1/4 innodb_buffer_pool_size = 4G#InnoDB的log buffer,通常设置为 64MB 就足够了 innodb_log_buffer_size = 64M#InnoDB redo log大小,通常设置256MB 就足够了 innodb_log_file_size = 256M#InnoDB redo log文件组,通常设置为 2 就足够了 innodb_log_files_in_group = 2 innodb_file_per_table = 1#InnoDB共享表空间初始化大小,默认是 10MB,改成 1GB,并且自动扩展 innodb_data_file_path = ibdata1:1G:autoextend#设置临时表空间最大4G innodb_temp_data_file_path=ibtmp1:500M:autoextend:max:4096M#启用InnoDB的status file,便于管理员查看以及监控 innodb_status_file = 1#当设置为0,该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。#当设置为1,该模式是最安全的,但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。#当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。 innodb_flush_log_at_trx_commit = 1 max_connections=600 max_connect_errors=1000 max_user_connections=400#设置临时表最大值,这是每次连接都会分配,不宜设置过大 max_heap_table_size 和 tmp_table_size 要设置一样大 max_heap_table_size = 100M tmp_table_size = 100M#每个连接都会分配的一些排序、连接等缓冲,一般设置为 2MB 就足够了 sort_buffer_size = 2M join_buffer_size = 2M read_buffer_size = 2M read_rnd_buffer_size = 2M#建议关闭query cache,有些时候对性能反而是一种损害 query_cache_size = 0 key_buffer_size = 8M long_query_time = 120 slow_query_log=1 #开启mysql慢sql的日志 log_output=table,File #日志输出会写表,也会写日志文件,为了便于程序去统计,所以最好写表 slow_query_log_file=/data/log/slow.log innodb_buffer_pool_dump_at_shutdown=1 innodb_buffer_pool_load_at_startup=1#打印deadlock日志 innodb_print_all_deadlocks=1