1.查询优化

1.1 小表驱动大表

优化原则:永远保持小的数据集驱动大的数据集!

in和exists的区别:in作用于子查询,exists作用于主查询!

因为in是将子查询的结果用于主查询的条件匹配,所以如果子查询的表数据集小于主查询表的数据集,推荐用in

Mysql查询截取分析

exists的原理跟in不一样,它是将主查询的数据放到子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据结果是否得以保留。所以如果子查询的表数据集大于主查询表的数据,就该用exists

Mysql查询截取分析

1.2 order by优化

MySQL支持2种方式的排序:①文件排序using  filesort

                                                   ②索引排序using  index

出现filesort表示系统性能出现问题,所以要让MySQL使用index索引排序,需要满足下面两种情况的任意一种:

order by语句使用索引最左前列

where与order by子句条件列组合满足索引最左前列

Mysql查询截取分析

上表总结了order  by要使用到index排序的情况:

1、排序的列必须也是是索引列

2、索引最左列(上例中的a列)一定要体现

3、排序列要么同升序要么同降序

1.3 group by优化

group  by与order  by大致一样,以下三种情况是group by独有的:

①group by实质是先排序后进行分组,遵循创建索引时的最佳左前缀法则;

②当无法使用索引列,在Mysql配置文件中增大max_length_for_sort_data参数和sort_buffer_size参数的值;

③where高于having,能写在where限定的条件就不要去having限定了。

2.慢查询日志

2.1 定义

MySQL的慢查询日志,用来记录响应时间超过阙值的sql语句,具体指运行时间超过long_query_time值的sql,就会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句(不包括10)

2.2 说明

默认情况下,慢查询日志是关闭的。如果不是为了调优,不建议启动该参数,会带来性能的影响,查看是否开启:show variables like '%slow_query_log%'。手动开启慢查询:set global slow_query_log=1;(重启MySQL后失效)

Mysql查询截取分析

2.3 慢查询日志

1、查看当前多少秒算慢

   show variables like 'long_query_time';

2、设置慢的阙值时间

   set global long_query_time=3;(重新开一个窗口才能看到修改后的值)

3、当前系统有多少条慢查询记录

    show global status like '%Slow_queries%';

3.show profile

show profile是Mysql提供用来分析当前会话中sql语句执行的资源消耗情况,用于sql调优的测量,默认关闭,若开启默认保存最近15次的运行结果

1、查看show profile是否开启?show variables like'profiling';

2、开启:set profiling=on;

3、查看最近执行结果:show profiles;

Mysql查询截取分析

4、诊断命令:show profile [cpu],[block io]...for query [query_ID]

Mysql查询截取分析

执行后,就可以看到该条sql语句在每一步花费的时间,找出最耗时的步骤,查询原因后进行优化

4.全局日志查询

切记,只允许在测试环境用,永远不要在生产环境中开启这个功能

①配置启用

   Mysql查询截取分析

②命令启用

       set global general_log=1;

       set global log_output='TABLE';

       此后,你所执行的sql语句,都会记录到Mysql库里的general_log表,可以使用下面的命令查看:select * from mysql.general_log

相关文章: