相信大家看过无数的MySQL调优经验贴了,会告诉你各种调优手段,如:
- 避免 select *;
- join字段走索引;
- 慎用in和not in,用exists取代in;
- 避免在where子句中对字段进行函数操作;
- 尽量避免更新聚集索引;
- group by如果不需要排序,手动加上 order by null;
- join选择小表作为驱动表;
- order by字段尽量走索引…
其中有些手段也许跟随者MySQL版本的升级过时了。我们真的需要背这些调优手段吗?我觉得是没有必要的,在掌握MySQL存储架构
和SQL执行原理
的情况下,我们就很自然的明白,为什么要提议这么优化了,甚至能够发现别人提的不太合理的优化手段。
在 InnoDB引擎篇 中,我们已经介绍了MySQL的存储架构,详细对你在MySQL存储
、索引
、缓冲
、IO
相关的调优经验中有了一定的其实。
本文,我们重点讲解常用的SQL的执行原理,从执行原理,以及MySQL内部对SQL的优化机制,来分析SQL要如何调优,理解为什么要这样…那样…那样…调优。
如果没有特别说明,本文以MySQL5.7版本作为讲解和演示。
阅读完本文,您将了解到:
- COUNT: MyISAM和InnoDB存储引擎处理count的区别是什么?
- COUNT: count为何性能差?
- COUNT: count有哪些书写方式,怎么count统计会快点?
- ORDER BY: order by语句有哪些排序模式,以及每种排序模式的优缺点?
- ORDER BY: order by语句会用到哪些排序算法,在什么场景下会选择哪种排序算法
- ORDER BY: 如何查看和分析sql的order by优化手段(执行计划 + OPTIMIZER_TRACE日志)
- ORDER BY: 如何优化order by语句的执行效率?(思想:减小行查询大小,尽量走索引,能够走覆盖索引最佳,可适当增加sort buffer内存大小)
- JOIN: join走索引的情况下是如何执行的?
- JOIN: join不走索引的情况下是如何执行的?
- JOIN: MySQL对Index Nested-Loop Join做了什么优化?(MMR,BKA)
- JOIN: BNL算法对缓存会产生什么影响?有什么优化策略?
- JOIN: 有哪些常用的join语句?
- JOIN: 针对join语句,有哪些优化手段?
- UNION: union语句执行原理是怎样的?
- UNION: union是如何去重的?
- GROUP BY: group by完全走索引的情况下执行计划如何?
- GROUP BY: 什么情况下group by会用到临时表?什么情况下会用到临时表+排序?
- GROUP BY: 对group by有什么优化建议?
- DISTINCT: distinct关键词执行原理是什么?
- 子查询: 有哪些常见的子查询使用方式?
- 子查询: 常见的子查询优化有哪些?
- 子查询: 真的要尽量使用关联查询取代子查询吗?
- 子查询: in 的效率真的这么慢吗?
- 子查询: MySQL 5.6之后对子查询做了哪些优化?(SEMIJOIN,Materializatioin,Exists优化策略)
- 子查询: Semijoin有哪些优化策略,其中Materializatioin策略有什么执行方式,为何要有这两种执行方式?
- 子查询: 除了in转Exists这种优化优化,MariaDB中的exists转in优化措施有什么作用?