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 索引结构】
推荐阅读
- MySQL读写分离?MySQL主从复制原理?如何解决主从同步延时?
- 小黄单车创始人 共享单车巨头
- 坐便器飞小虫子怎么处理,马桶飞虫从哪里出来的
- 梦见水从地下往上冒成了一个池塘 梦见水从地下往上冒,地裂缝
- 闻香识台茶
- 肖光亮,从门外汉到制茶能手
- 梦见车子从很高掉下去醒来心跳很快吓死了 梦见车子从很高掉下去,粉身碎骨
- 郑来荣,昔日庄稼汉 今朝茶老板
- 梦见用担架抬死人,突然人活了 梦见用担架抬死人从我身边路过
- 秋季润燥保健茶方DIY推荐
