5.10 小结



慢查询,原因及优化方向。

一、慢查询的怀疑方向

1.1 三个方向

比如:

  • 该建索引的,没有建索引。
  • 该建联合索引的,没有建联合索引。
  • 该放第一顺位的,没有放第一顺位。

比如,索引字段涉及函数运算。就会失效。

比如,数据自动选取索引的标准:基数Cardinality,估算不准。

二、核心内容

2.1 索引覆盖

索引覆盖,贯穿了整个一章的内容,尤其是联合索引,至关重要。

本质:只在一颗B+树上操作即可,不用再回主B+树了。

因为回表,就要遍历另一棵B+树,同时还要解析行记录,性能变差。

就是说,辅助索引的这一课B+树,就足够用了,就能cover掉所有的查询条件了。

index covering

2.2 索引基数

索引基数 Cardinality (索引区分度)

索引基数是MySQL的server层,用来估算索引性能好坏的指标。

2.3 count() 函数

用来计算数据表一共有多少行数。

因为count(*)是用索引遍历了一遍B+树,很快:

2.4 排序 order by

排序,往往是性能经常出问题的地方。

在SELECT字段,筛选出来之后,才会去排序。

2.5 rand()函数:随机选取

输出一个0-1之间的小数:

2.6 索引下推 index condition pushdown

如果索引,可以对where语句的查询条件进一步判断,先使用这条索引判断,判断完了之后最后再回表。

2.7 松散索引扫描 index scan skip

MySQL 8.0

2.8 索引失效:字段做函数操作

核心原理:不要动索引字段,让外面的条件去改变

2.9 分页查询

2.10 查询语句,各关键词的执行顺序

借鉴:https://deepinout.com/sql/sql-dql/sql-select-statement-execution-order.html

即:

2.11高级的、复杂的SQL语句的优化:见招拆招

只要知道了InnoDB查询的数据结构、存储结构等原理,以及一些基本的优化方法之后,再面对一些高级的、复杂的SQL语句的优化时,就能见招拆招。

  • 看看,能不能多走索引
  • 看看SQL语句,结构上进行调整

优质文章:https://zhuanlan.zhihu.com/p/493780361

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 5.10 小结


Follow excellence, and success will chase you.