慢查询,原因及优化方向。
一、慢查询的怀疑方向
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
Comments | NOTHING