MySQL索引优化(为排序)

MySQL优化

一般面试MySQL怎么做优化的答题思路:
1.先至少让系统跑一天,看看系统的慢SQL情况
2.开启慢查询日志,设置阙值,比如超过5秒的就是慢SQL,并将它抓取出来
3.explain+慢SQL 进行分析
4.show profile查询SQL在MySQL服务器里面的执行细节和生命周期情况
5.SQL数据库服务器的参数调优

一、优化原则:小表驱动大表,即小的数据集驱动大的数据集。

当B表的数据集必须小于A表的数据集时,用in优于exists

SELECT * FROM A WHERE id IN (SELECT id FROM B);
等价于
SELECT * FROM A WHERE EXISTS (SELECT  1 FROM B WHERE B.id=A.id)

当A表的数据集必须小于B表的数据集时,用exists优于in

EXISTS
SELECT ... FROM table WHERE EXISTS(subquery)

该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(true/false)来决定主查询的数据结果是否得以保留。
在这里插入图片描述

二、Order By优化

1.ORDER BY子句,尽量使用index方式排序,避免使用FileSort方式排序
(1)建立一个表tblA,并在age和birth字段上建立复合索引
在这里插入图片描述
(2)分析Order By后的索引使用情况

EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY age;

在这里插入图片描述

EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY age,birth;

在这里插入图片描述

EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY birth;

在这里插入图片描述
产生了filesort

EXPLAIN SELECT * FROM tblA WHERE age>20 ORDER BY birth,age;

在这里插入图片描述
产生了filesort
在这里插入图片描述
MySQL支持两种方式的排序,FileSort和Index,index效率高,它指MySQL扫描索引本身完成排序,FileSort方式效率较低。

order by满足两情况时,会使用index方式排序:1.order by语句使用索引最左前列 2.使用where子句与order by子句条件组合满足索引最左前列。
尽可能在索引列上完成排序操作,遵照索引建立的最佳左前缀原则。
如果不在索引列上,filesort有两种算法,双路排序和单路排序:
在这里插入图片描述
单路排序会有些问题,例如:
在这里插入图片描述
优化策略:
在这里插入图片描述
为什么呢?
在这里插入图片描述
最后来一个总结:
在这里插入图片描述

三、Group By优化

在这里插入图片描述

发布了23 篇原创文章 · 获赞 67 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43395911/article/details/104370197
今日推荐