mysql优化案例
这个案例大概是几年前的一个案例,当时的一个开发反馈说是某个后台的页面经常加载不出来,这个页面主要是显示我们业务上面的数据,一些订单。后来他查看数据库发现是获取数据库里面的数据时间比较久。那看来就是查询时间优化的一个问题,然后开发让我去协助他。
数据库的一个配置就是8核8g,MySQL版本是5.6。这个库的大小大概有十几个G的数据。
我查看了一下,发现查询确实非常缓慢,一个结果要等65s才出来结果,我看了索引是有的。然后我又发现他们的表的存储引擎是myisam,我当时想的是看看有没有方法是通过调参数和慢查询日志来解决一下,。我记得印象很深的一个参数是key_buffer_size
,这个值主要是对myisam引擎有效果,我从原来的500mb调到了700mb,然后又调了一下线程的参数比如thread_concurrency
,这个是多线程,对性能也是有一定影响的,还有其他的参数,记得不是很清楚了。写入配置文件又进行重启MySQL服务,再次查看效果好了一点,查询时间是十几秒,这个过程看上去有效果,但是结果还是不尽人意。所以我们计划再调调试试,但是发现无论怎么调结果都不是很理想。所以我们后来直接替换存储引擎,把myisam改成innodb。过程是
1、导出数据库的表结构mysqldump -d -uxxx -p shop > shop_table.sql
其中-d
参数表示不导出数据,只导出表结构
2、替换shop_table.sql里的MyISAM为INNODBsed -i 's/MyISAM/INNODB/g' shop_table.sql
3、新建数据库shop_new,并导入表结构mysql > create database shop_new;mysql -uroot -p shop_new < shop_table.sql
可以通过show table status来检查表引擎是否为INNODB。
4、导出shop的数据mysqldump -t -uroot -p shop > shop_data.sql
其中-t参数表示只导数据,不导表结构
5、导入数据到shop_newmysql -uroot -p shop_new < shop_data.sql
6、 首先开启慢日志,修改/etc/my.cnf 增加以下两段配置,保存重启mysql
long_query_time = 2
log_slow_queries = /data/mysql/slow.log
7、然后重新建立索引,索引不能构建的太多,对需要的表进行构建索引,优化sql执行语句。
期间都是通过explain命令查看索引是否构件好以及生效。
最后成功把表查看优化到0.1s的执行时间。