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有两种算法,双路排序和单路排序:
单路排序会有些问题,例如:
优化策略:
为什么呢?
最后来一个总结: