MySQL语句优化补充(一)
前面已经写了一些关于优化sql语句的方法。为了更形象的在项目中使用,以现有的数据再次详细说明一些,希望对sql优化有更进一步的学习。
一、从发现问题到解决问题
以本地数据 my_order
表为例,先生成119w多条记录。
根据id查询一条数据,用时0.00s
用 explain
查看详情,用到了主键索引 primary key
;查询的行数row=1;
同理,若用oid 查询一条数据,用时0.26s
explain 查看一下,没用任何索引,查询的行数row=1186791
对比两条语句,差别在于where字句后的字段是否使用了索引,初步判断是因为索引的问题。先不说索引的问题。
二、先开启慢查询
1 | show variables like "slow%"; |
设置慢查询时间,为了更好的测试设置为0.1s,在实际项目中根据需求设置,比如设为0.5s等。
1 | show variables like "%long%"; |
1 | set long_query_time=0.1; |
再次运行
1 | select * from my_order where oid='o_201904060514268977'; |
打开慢日志文件,可查看刚才运行的语句。
三、查看性能
1 | show variables like "%profiling%"; |
1 | set profiling=on; |
再次运行
1 | select * from my\_order where oid='o_201904060514268977'; |
1 | show profiles; |
可以看到刚才语句语句运行的更具体的时间。再进一步分析:
1 | show profile for query 2; |
通过上图可以看到详细的运行时间。其中,Sending data花费时间最长。
并且,注意:logging slow query 也花费时间,一般不要在线上开启慢查询,等需要分析的时候再启用。
四、加索引优化
增加索引,
1 | alter table my_order add index(oid); |
并运行:
1 | select * from my_order where oid='o_201904060514268977'; |
再分析一下:
看来加索引解决了刚才慢查询的问题。
MySQL语句优化补充(一)