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";

d.%abc%的查询将导致全表扫描
e.sql子句中尽量不要进行函数操作,表达式操作
f.尽可能的使用 varchar 代替 char 
g.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
h.尽量使用union all替换union
i.能够用DISTINCT的就不用GROUP BY
j.合理使用EXISTS,NOT EXISTS子句
k.尽量不要用SELECT INTO语句。SELECT INTO 语句会导致表锁定,阻止其他用户访问该表。
posted on 2020-04-01 15:25  微笑的蜗牛  阅读(227)  评论(0)    收藏  举报