从头带你捋一遍 MySQL 索引结构( 六 )


1、根据搜索条件,找出所有可能使用的索引
2、计算全表扫描的代价
3、计算使用不同索引执行查询的代价
4、对比各种执行方案的代价,找出成本最低的那一个。
根据我们刚才的那张表的非聚簇索引,这条语句就是由于查询优化器的作用,造成没有走索引:
SELECT*FROMuserwhereage>12.在稀疏索引情况下通常需要通过叶子节点的指针回表查询数据,什么情况下不需要回表?
科普时间:覆盖索引 覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取 。也可以称之为实现了索引覆盖 。
当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率 。
如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2) 。当我们通过SQL语句:select key2 from covering_index_sample where key1 = 'keytest';的时候,就可以通过覆盖索引查询,无需回表 。
例如:
SELECTageFROMuserwhereage=1这句话就不需要进行回表查询 。
结语本篇文章着重聊了一下关于MySQL的索引结构,从零开始慢慢构建了一个B+树索引,并且根据这个过程谈了B+树是如何一步一步去优化查询效率的 。
简单地归纳一下就是:
排序:优化查询的根本,插入时进行排序实际上就是为了优化查询的效率 。
页:用于减少IO次数,还可以利用程序局部性原理,来稍微提高查询效率 。
页目录:用于规避链表的软肋,避免在查询时进行链表的扫描 。
多页:数据量增加的情况下开辟新页来保存数据 。
目录页:“特殊的页目录”,其中保存的数据是页的地址 。查询时可以通过目录页快速定位到页,避免多页的扫描 。

【从头带你捋一遍 MySQL 索引结构】


推荐阅读