MySQL性能优化之系统配置优化
数据库优化维度有四个:硬件升级、系统配置、表结构设计、SQL语句及索引。按优化成本和优化效果两个不同维度排序,如下:
优化成本:硬件升级>系统配置>表结构设计>SQL语句及索引。
优化效果:硬件升级<系统配置<表结构设计<SQL语句及索引。
即成本越高优化效果反而是最小的,所以如果做优化选择在条件许可下必然选择成本小效果好的。
对于MySQL的性能优化,本文从软件可支配角度对系统配置优化进行探究,对其实现方式进行实践。
1、保证从内存中读取数据
MySQL会在内存中保存一定的数据,通过LRU算法将不常访问的数据保存在硬盘文件中。尽可能的扩大内存中的数据量,将数据保存在内存中,从内存中读取数据,可以提升MySQL性能。
具体操作就是修改配置参数innodb_buffer_pool_size,将其扩大能够全然从内存中读取数据并最大限度降低磁盘操作。
确定innodb_buffer_pool_size足够大:show global status like 'innodb_buffer_pool_pages_%';
innodb_buffer_pool_size默认为128M,理论上可以扩大到内存的3/4或4/5。直接修改配置 my.cnf
innodb_buffer_pool_size = 750M
如果是专用的MySQL Server可以禁用SWAP
使用命令swapoff -a ,可关闭所有交换设备和文件。
让数据库占用更多内存的操作方式,如果要不影响其他同机运行的文件对内存设备要求比较高。
2、数据预热
默认情况,仅仅有某条数据被读取一次后,才会缓存在 innodb_buffer_pool——即不用不加载。所以,数据库刚刚启动,须要进行数据预热,将磁盘上的全部数据缓存到内存中。数据预热能够提高读取速度,具体操作如下:
1)对于InnoDB数据库,编写数据预热的脚本命名为:loadtomem.sql
2)执行命令:mysql -uroot -pXXXX -AN < /root/loadtomem.sql > /root/loadtomem.sql
3)在需要数据预热时,比如重启数据库执行命令:mysql -uroot < /root/loadtomem.sql > /dev/null 2>&1
3、降低磁盘写入次数
1)增大redolog,减少落盘次数:innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size。
2)通用查询日志、慢查询日志可以不开 ,bin-log开生产中不开通用查询日志,遇到性能问题开慢查询日志。
3)写redolog策略 innodb_flush_log_at_trx_commit设置为0或2。如果不涉及非常高的安全性 (金融系统),或者基础架构足够安全,或者事务都非常小,都能够用 0或者 2 来减少磁盘操作。
4、提高磁盘读取性能
这个就是内存磁性能的问题了,经济条件许可下采购性能更好的内存盘。