1.查询优化
1.1 小表驱动大表
优化原则:永远保持小的数据集驱动大的数据集!
in和exists的区别:in作用于子查询,exists作用于主查询!
因为in是将子查询的结果用于主查询的条件匹配,所以如果子查询的表数据集小于主查询表的数据集,推荐用in
exists的原理跟in不一样,它是将主查询的数据放到子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据结果是否得以保留。所以如果子查询的表数据集大于主查询表的数据,就该用exists
1.2 order by优化
MySQL支持2种方式的排序:①文件排序using filesort
②索引排序using index
出现filesort表示系统性能出现问题,所以要让MySQL使用index索引排序,需要满足下面两种情况的任意一种:
①order by语句使用索引最左前列
②where与order by子句条件列组合满足索引最左前列
上表总结了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后失效)
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;
4、诊断命令:show profile [cpu],[block io]...for query [query_ID]
执行后,就可以看到该条sql语句在每一步花费的时间,找出最耗时的步骤,查询原因后进行优化
4.全局日志查询
切记,只允许在测试环境用,永远不要在生产环境中开启这个功能
①配置启用
②命令启用
set global general_log=1;
set global log_output='TABLE';
此后,你所执行的sql语句,都会记录到Mysql库里的general_log表,可以使用下面的命令查看:select * from mysql.general_log