一、查询优化
1)永远小表驱动大表
- EXISTS
SELECT ...FROM table WHERE EXISTS(subquery)
该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据结果是否得以保留。
- 提示
1.EXISTS(subquery)只返回 true 或 false,因此子查询中的 SELECT * 也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。
2.EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。
3.EXISTS 子查询往往也可以用条件表达式、其他子查询或者 JOIN 来代替,何种最优要具体分析
2)ORDER BY 关键字优化
3)GROUP BY 关键字优化
- group by 实质是先排序后进行分组,遵照索引的最佳左前缀
- 当无法使用索引列,增大max_length_for_sort_data参数的设置+sort_buff_size参数的设置
- where高于having,能写在where限定的条件就不要去having限定了
二、慢查询日志
-> 使用命令 set global long_query_time=3 修改为阙值到3秒钟的就是慢sql
-> 需要重新连接或新开一个会话才能看到修改值。
- SHOW VARIABLES LIKE 'long_query_time%';
- show global variables like 'long_query_time';
-> select sleep(4); 模拟慢sql,沉睡4秒
三、Show Profile
- 是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优测量
- 管网:http://dev.mysql.com/doc/refman/5.5/en/show-profile.html
- 默认情况下,参数处于关闭状态,并保存最近15次的运行结果