MySQL

洞悉MySQL底层架构与SQL调优本质
帅旋
关注
充电
IT宅站长,技术博主,共享单车手,全网id:arthinking。

SQL运行内幕:从执行原理看调优本质

发布于 2020-06-26 | 更新于 2024-02-24

相信大家看过无数的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要如何调优,理解为什么要这样…那样…那样…调优。

image-20200626112814627

如果没有特别说明,本文以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优化措施有什么作用?

image-20200626122041744

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/mysql/how-sql-works-understand-the-essence-of-tuning-by-the-execution-principle.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

IT宅

关注公众号及时获取网站内容更新。