MySQL数据库参数优化

在MySQL数据库使用之前,根据实际业务情况,对一些重要的参数进行优化将有利于数据库的性能的提升及可靠性,首先查看MySQL的参数配置文件可以通过mysql --help|grep my.cnf,注意这个命令输出的配置文件不只一个,如:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf MySQL数据库启动之后会到以下路径下查找配置文件,并且以后查找到的为准,所以一定要保证my.cnf配置文件只放到一个目录下。否则可能会找出冲突,导致你配置的参数失效。
MySQL数据库的参数分为两种:
动态(dynamic)参数:可以在MySQL实例运行的时候修改并生效;
静态(static)参数:在整个实例生命周期内不允许修改。
可以使用SET命令对动态参数进行修改,语法如下:
SET |[global | session] system_var_name=expr | [@@global. | @@session. | @@] system_var_name=expr
命令中的global和session关键字表示这个参数的修改是基于当前会话的还是整个实例的生命周期。有些动态参数只能在会话中进行修改,如autocommit;有些参数修改后会在整个实例生命周期中生效,如:binlog_cache_size。
如果想在数据库实例下一次启动的时候参数还是有效的,那么就必须在my.cnf配置文件中对参数进行修改。
内存配置相关参数
1.sort_buffer_size:排序缓冲区大小,这个参数定义了每个线程所使用的排序缓冲区的大小,当查询请求需要排序时,MySQL服务器会立即分配给链接这个参数所定义大小的缓冲区的全部内存。而不管这个排序是否需要这么大的内存,如果把这个参数设置成100M,那么10个需要排序查询的链接就会占用1G的内存,因此这个参数的配置要格外小心,不要将这个参数的值设置的过大。
2.join_buffer_size:这个参数定义的是MySQL的每个线程所使用的连接缓冲去的大小,如果查询中关联了多张表,那么MySQL就会为每一个连接分配一个缓冲区,因此这个参数也不要设置的过大。在这里需要提醒一下,在互联网环境中,为了提升性能,尽量避免使用连表查询,尤其是大表的连表查询。
3.read_buffer_size:这个参数是在MySQL进行全表扫描时所分配的内存的大小,这个参数的大小一定要是4K的倍数。
4.read_rnd_buffer_size:索引缓冲区的大小,MySQL只是在需要时分配索引缓冲区,并且只会分配需要的内存的大小,不会按照参数设置的大小分配内存。
以上四个参数都是为每个线程分配的,也就是说,如果有100个线程,那么所使用的内存就要×100,所以这些参数的配置值都不能过大,否则就可能找出内存浪费甚至溢出。
5.innodb_buffer_pool_size:innodb存储引擎缓冲池大小,innodb缓冲池中缓存的数据页(默认16K)类型有:索引页、数据页、undo页、插入缓冲(合并多次写为一次写)、自适应哈希索引、锁信息、数据字典信息等。索引innodb存储引擎的性能严重依赖于这个参数,一般情况下,在系统允许的范围内,这个值应该设置的尽量大一些,计算公式如下:
总内存-(每个线程所使用的内存×连接数)-系统保留内存。在MySQL的官方手册中建议将innodb_buffer_pool_size的大小设置为服务器内存的75%以上,但这要考虑实际情况,必须满足上面的公式的前提下才可以设置。
从InnoDB1.0.x版本之后,引入了innodb_buffer_pool_instances参数,这个参数允许设置多个缓冲池实例,每个页根据哈希值平均分配到不同的缓冲池实例中。这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。可以通过命令show variables like 'innodb_buffer_pool_instances'\G查看当前缓冲池实例个数。
IO相关配置参数
innodb是基于事务的存储引擎,每次数据修改,innodb首先要将事务预写到事务日志中,然后再写入磁盘,而不是每次提交都写入磁盘,因为磁盘IO的性能比较差。
1.innodb_log_file_size:单个事务日志大小
2.innodb_log_files_in_group:innodb事务日志文件的数量
事务日志的总大小=innodb_log_files_in_group×innodb_log_file_size,事务日志是循环写入的方式,如果事务比较繁忙,建议将innodb_log_file_size的值调整大一些,减少文件交换。事务日志应能保持数据库服务器近1-2个小时内的事务状况,这样有利于数据恢复。
3.innodb_log_buffer_size:日志缓冲区大小,一般32M就足够用了。
4.innodb_flush_log_at_trx_commit:该参数控制innodb事务日志的刷新频次,有三个值:
0:每秒进行一次log写入cache,并flush log到磁盘;
1:默认值,在每次事务提交执行log写入cache,并flush log到磁盘,这种配置最安全,但是性能低;
2:建议使用这个值,每次提交事务,执行log写入cache,每秒执行一次flush log到磁盘。
5.innodb_flush_method:innodb刷新的方式,建议使用O_DIRECT,关闭深度缓存。
6.innodb_file_per_table:innodb如何使用表空间,如果设置为1,那么将为每个表建立一个独立的表空间,这里强烈建议设置该参数为1。
7.innodb_doublewrite:开启innodb二次写,为了增加数据的安全性,该参数也强烈建议设置为1。
安全相关参数
1.expire_logs_days:指定自动清理binlog的天数,建议设置在7天左右。
2.max_allowed_packet:控制MySQL可以接收的数据包的大小,建议改成32M。如果使用了主从复制,那么这个参数最好保持一致。
3.sysdate_is_now:确保sysdate()返回确定性。
4.read_only:禁止非super权限的用户写权限,建议在主从复制环境的从数据库上开启这个配置,以保证从数据库不会被误写。
5.skip_slave_start:禁止slave自动恢复,建议在主从复制环境的从数据库上开启这个配置,以避免从数据库重启后自动启动负责。
其他
1.sync_binlog:控制MySQL如何向磁盘刷新binlog,主从复制环境,建议将主数据库设置为1
2.tmp_table_size和max_heap_table_size:控制内存临时表的大小,这两个值应该设置相同值,而且不要太大。
3.max_connections:最大连接数,默认是100,这个值太小了,建议改成2000及以上。

你可能感兴趣的:(数据库)