使用慢查询日志
show variables like '%slow_query_log%'
0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表
2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析
执行计划:
查看SQL执行情况,优化SQL语句
EXPLAIN 有两个变种
explain extended:会在 explain 的基础上额外提供一些查询优化的信息。在其后通过show warnings;
命令可以得到优化后的查询语句(简单语句的优化,复杂的不行)
eg: explain extended select * from student WHERE id = 1;
![5e0a82e9fa659da2cc0c430d96c48806.png](https://i-blog.csdnimg.cn/blog_migrate/b84bff919cb579ab8c135ef8d4e6ac46.png)
explain partitions:相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。
![79f565e65f3ca96e83120ccbbb4c7576.png](https://i-blog.csdnimg.cn/blog_migrate/68e198fd3bd60feaffa7c103b4afef94.png)
1.id 列
id 列的编号是 SELECT 的序列号,有几个 SELECT 就有几个 id,并且 id 的顺序是按 SELECT 出现的顺序增长的。id 列越大执行优先级越高,id 相同则从上往下执行,id 为 NULL 最后执行
eg:子查询 EXPLAIN SELECT (SELECT 1 FROM student LIMIT 1) FROM course;
![894b88d61cbe7f287a6e7b5f482e6e8f.png](https://i-blog.csdnimg.cn/blog_migrate/18442311792afbe64eeb1e97d5511438.png)
FROM 子句中的子查询 EXPLAIN SELECT id FROM (SELECT id FROM student) AS stu;
![2af9b6e8f43a13ac1bdb0f61c69bd14f.png](https://i-blog.csdnimg.cn/blog_migrate/c2da3fc9beda7da35ce63e614309802b.png)
union查询 EXPLAIN SELECT 1 UNION ALL SELECT 1;
![082ac045c2d77e0ecb182b00f484ef41.png](https://i-blog.csdnimg.cn/blog_migrate/00dac8cd96125ff9397461fb78f62f5a.png)
mysql 5.7之后做了优化 5.7之前执行三次,union结果总是放在一个匿名临时表,id是null,,最后执行
2. select_type列
select_type 表示对应行是简