MySQL之七:SQL 语句的常规优化
一、InnoDB索引基本结构
1.1 基本知识点
1.2 示意图
1.2.1 单页结构
叶子页
叶子页结构中,key为索引列值,value为要使用索引查找的值(也就是说,叶子节点中存放了实际的数据,value的位置存放的是非索引key列的列值,对于聚集索引,value存放的是表的数据行记录,对于辅助索引,value存放的是聚集索引的key值)
非叶子页
非叶子页的结构中,记录的内容相当于是索引key的索引数据(也就是说,非叶子节点中并不包含实际的数据,key部分存放的不是实际的key列值,而是key列的一个范围边界值;value的位置存放的是指向其他非叶子页或叶子页的指针)
1.2.2 单页详细结构
1.2.3 单层BTREE结构
单层BTREE结构
完整的单层BTREE结构示意图如上( 每一个页在FIL 头中都包含了 “previous page” and “next page”指针,这些指针用于在同层级的页之间形成双向链接列表,从图中我们可以看到,每个页之间都包含了两个方向的箭头指针,在单层结构的BTREE中,可以根据双向链表指针从左往右查找页)
1.2.4 多层BTREE结构
多层BTREE结构
完整的多层BTREE结构示意图如上(这是一个三层结构BTREE,可以看到只有leaf 叶子节点页中存在value值,root根节点页和internal中间层页中只有key值范围),在多层结构的BTREE中,可以根据非叶子节点中存放的页指针和页之间的双向链表指针共同确定需要查找的页,以减少访问不必要的页(尤其是在范围查询中,可以通过双向链表横向查找页,而不需要频繁地回到根页从头开始查找)
1.2.5 聚集索引和辅助索引结构
1.2.6 多列索引结构
多列索引结构
类比:order by c1,c2,c3
;因此,按照索引顺序,如果在查询语句的where
条件中,索引前面的列缺失,或者前面的列使用了范围值,则后面的索引列无法用于检索数据,只能用于过滤数据
二、SQL 语句执行的基本原理
2.1 执行流程
2.2 执行流程示意图
2.3 索引查找流程
MySQL内部利用索引来查找数据的流程,大致包含3个子流程:
Index Key
:该子流程用于确定查询语句需要扫描的数据范围,实际对应的就是查询语句可以利用到的MySQL索引部分,并按照确定的数据范围进行数据查找。Index Filter
:该子流程用于确定查询语句执行过程中哪些数据可以用索引来过滤,即,在启用查询优化器的ICP特性且在执行查询时能够使用该特性时,该子流程用于确定可以使用索引过滤的部分,并执行索引过滤Table Filter
:该子流程用于当MySQL无法用索引过滤时,回表取回行数据后,到server层进行数据过滤
三、如何快速查看执行计划
3.1 概述
3.2 select_type字段
3.3 type字段