MaySql SQL语句优化
1. 慢查询日志开启
- 查看是否开启: show variables like '%slow_query_log%';
- 开启慢查询日志:set global slow_query_log=1; (重启会失效)
-
开启了慢查询日志后,什么样的SQL才会记录到查询日志里面?
这个是由参数long_query_time控制,默认情况下long_query_time的值为10秒
查看命令: show variables like 'long_query_time%';
![]()
注: 永久设置慢查询日志开启,以及设置慢查询日志时间临界点(不建议)
linux中,mysql配置文件一般默认在 /etc/my.cnf 更改对应参数即可
2. 慢查询日志设置与查看
- 设置阀值命令: set global long_query_time=3 (修改为阀值到3秒钟的就是慢sql)
为什么设置后看不出变化:
- 需要重新连接或新开一个会话才能看到修改值。 show variables like 'long_query_time%';
- 直接 show global variables like 'long_query_time';
查看慢查询日志:
cat -n /data/mysql/mysql-slow.log

从慢查询日志中,我们可以看到每一条查询时间高于3s 的sql语句,并可以看到执行的时间是多少。
比如上面,就表示 sql语句 select * from comic where comic_id < 1952000; 执行时间为3.902864秒,超出了我们设置的慢查询时间临界点3s,所以被记录下来了

查看有多少条慢查询记录: show global status like '%Slow_queries%';
3.导致SQL变慢的原因
a.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描
b.in 和 not in 也要慎用,否则会导致全表扫描
select id,name from lx_com where id in (select id from ids)
并不等价于
select id,name from lx_com where id in (3,5,7)
c.对于连续的数值,能用 between 就不要用 in :
$sql1 ="select id from `dye_production_schedules` where product_id in (2401,2402.2403)";
$sql2 ="select id from `dye_production_schedules` where product_id between 2400 and 2404";

浙公网安备 33010602011771号