如何调优SQL
以MySQL为例
- 如何定位并优化慢查询SQL
- 联合索引的最左匹配原则的成因
- 索引是建立得越多越好吗
一、如何定位并优化慢查询SQL
SQL语句优化基本操作
1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3)很多时候用 exists 代替 in 是一个好的选择
4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤
具体场景具体分析,在这里只提出大致思路
- 根据慢日志定位慢查询SQL
- 使用explain等工具分析sql
- 修改SQL或者尽量让SQL走索引
根据慢日志定位慢查询SQL
使用命令 show variables like '%quer%';来查询相关的系统变量;
- show_query_log:慢日志状态,off是关闭,on是打开;使用 set global show_query_log = on;打开
- show_query_log_file:慢日志记录的文件
- long_query_time:每次执行SQL超过这个时长就是慢SQL,以秒为单位;使用set global long_query_time = 1;设置时长
这些命令只是临时改变这些环境变量,如果想长期使用,需要修改配置文件my.ini

使用show status like '%show_queries%';查看本次会话的慢查询的数量,一旦重新打开会话就会清零。

浙公网安备 33010602011771号