1、覆盖索引

1.1 概念

索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。

1.2 判断标准

使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询

1.3 注意

不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B+Tree索引做覆盖索引
不同的存储引擎实现覆盖索引都是不同的,并不是所有的存储引擎都支持它们

1.4 优点

覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不用读取数据有以下一些优点
1、索引项通常比记录要小,所以MySQL访问更少的数据
2、索引都按值的大小顺序存储,相对于随机访问记录,需要更少的I/O
3、大多数据引擎能更好的缓存索引,比如MyISAM只缓存索引
4、覆盖索引对于InnoDB表尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了

2、最左前缀原则

mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:
字段有3列,a,b,c,建立索引:idx_a_b_c
则生效的查询条件有:

  1. a =x
  2. a =x and b=y 或者(b =y and a=x,即顺序不影响,SQL优化器会自动处理,以下同理)
  3. a =x and c =y
  4. a=x and b=y and c=z

3、索引下推

“索引条件下推”,称为 Index Condition Pushdown (ICP)是mysql中一个常用的优化,尤其是当mysql需要从一张表里检索数据时。 如果没有ICP,存储引擎将会根据WHERE子句的条件遍历整个表单数据,然后返回给mysql服务器。启用ICP,如果可以通过使用索引的列来满足WHERE条件,MySQL服务器将WHERE条件的这部分推送到存储引擎。然后,存储引擎通过使用索引来确定推送的条件,并且通过这样的方式从表中读取行。 ICP可以减少存储引擎必须访问基础表的次数以及MySQL服务器必须访问存储引擎的次数。

不使用ICP的查询SQL流程图

过程解释
①:MySQL Server发出读取数据的命令,这是在执行器中执行如下代码段,通过函数指针和handle接口调用存储引擎的索引读或全表表读。此处进行的是索引读。
if (in_first_read)
{
in_first_read= false;
error= (*qep_tab->read_first_record)(qep_tab); //设定合适的读取函数,如设定索引读函数/全表扫描函数
}
else
error= info->read_record(info);

②、③:进入存储引擎,读取索引树,在索引树上查找,把满足条件的(经过查找,红色的满足)从表记录中读出(步骤④,通常有IO),从存储引擎返回⑤标识的结果。此处,不仅要在索引行进行索引读取(通常是内存中,速度快。步骤③),还要进行进行步骤④,通常有IO。

⑥:从存储引擎返回查找到的多条元组给MySQL Server,MySQL Server在⑦得到较多的元组。

⑦–⑧:⑦到⑧依据WHERE子句条件进行过滤,得到满足条件的元组。注意在MySQL Server层得到较多元组,然后才过滤,最终得到的是少量的、符合条件的元组。

使用ICP的查询SQL流程图

过程解释
①:MySQL Server发出读取数据的命令,过程同图一。

②、③:进入存储引擎,读取索引树,在索引树上查找,把满足已经下推的条件的(经过查找,红色的满足)从表记录中读出(步骤④,通常有IO),从存储引擎返回⑤标识的结果。此处,不仅要在索引行进行索引读取(通常是内存中,速度快。步骤③),还要在③这个阶段依据下推的条件进行进行判断,不满足条件的,不去读取表中的数据,直接在索引树上进行下一个索引项的判断,直到有满足条件的,才进行步骤④,这样,较没有ICP的方式,IO量减少。

⑥:从存储引擎返回查找到的少量元组给MySQL Server,MySQL Server在⑦得到少量的元组。因此比较图一无ICP的方式,返回给MySQL Server层的即是少量的、符合条件的元组。

另外,图中的部件层次关系,不再进行解释。

MySQL 覆盖索引、最左前缀原则、索引下推相关推荐

  1. 覆盖索引最左前缀原则索引下推

    覆盖索引 如果执行的语句是 select ID from T where k between 3 and 5,这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果, ...

  2. mysql索引最左前缀原则

    mysql索引最左前缀原则 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因. 第三, ...

  3. 数据库性能优化1——正确建立索引以及最左前缀原则

    1. 索引建立的原则 用于索引的最好的备选数据列是那些出现在WHERE子句.join子句.ORDER BY或GROUP BY子句中的列. 仅仅出现在SELECT关键字后面的输出数据列列表中的数据列不是 ...

  4. 数据库正确建立索引以及最左前缀原则

    数据库正确建立索引以及最左前缀原则 转自:https://blog.csdn.net/zhanglu0223/article/details/8713149 1. 索引建立的原则 用于索引的最好的备选 ...

  5. 正确建立索引以及最左前缀原则

    1. 索引建立的原则 用于索引的最好的备选数据列是那些出现在WHERE子句.join子句.ORDER BY或GROUP BY子句中的列. 仅仅出现在SELECT关键字后面的输出数据列列表中的数据列不是 ...

  6. 我去,为什么最左前缀原则失效了?

    问题 最近,在 mysql 测试最左前缀原则,发现了匪夷所思的事情.根据最左前缀原则,本来应该索引失效,走全表扫描的,但是,却发现可以正常走索引. 表结构如下( Mysql 版本 5.7.22): C ...

  7. mysql非聚集索引区间查询_mysql的聚集索引和非聚集索引,回表查询,索引覆盖,最左前缀原则略解...

    什么是聚集索引和非聚集索引 我们知道 Mysql 底层是用 B+ 树来存储索引的,且数据都存在叶子节点.对于 InnoDB 来说,它的主键索引和行记录是存储在一起的,因此叫做聚集索引(clustere ...

  8. mysql索引优化原则:覆盖索引、最左前缀原则、索引下推

    文章目录 前言 round1:覆盖索引 round2:最左前缀原则 round3:索引下推 小结 前言 在文章开始前,小编提出几个问题,读者可以思考一下如何回答.如果对于以下的问题,回答的模棱两可甚至 ...

  9. 【MySQL】索引原理(三):联合索引(最左前缀原则),覆盖索引,索引条件下推

    准备工作,下面的演示都是基于user_innodb表: DROP TABLE IF EXISTS `user_innodb`; CREATE TABLE `user_innodb` (`id` big ...

最新文章

  1. Redis key 相关命令
  2. python paramiko 问题总结
  3. 终于搞明白gluPerspective和gluLookAt的关系了
  4. 图像的频率谱和功率谱代表什么_视频/图像质量评价综述(三)
  5. linux怎么看java环境变量_linux下配置jdk环境变量以及查看java版本
  6. 如何用多线程方式,提高rabbitmq消息处理效率?
  7. powerbi绘制地图_如何使用PowerBI绘制SQL Server 2017图形数据库
  8. 聚焦IT系统稳定性保障服务 PerfMa笨马网络完成亿元级B轮融资
  9. 程序员遇到什么样的工作状态应该果断跳槽走人?
  10. android开发-01-搭建环境
  11. 计算机专业面试 英文,计算机专业英文面试自我介绍.doc
  12. spss可以关键词词频分析吗_做关键词分析,我有4款免费词云工具
  13. nginx中$host、$http_host和$proxy_host区别
  14. 提示磁盘被写保护怎么办?
  15. Kotlin项目实战之手机影音---悦单条目实现及BaseListFragment抽取
  16. 通过读取学生txt,进而实现随机选人(包含对应人物照片)并用GUI实现
  17. 怎样清除手机上的微信小程序的缓存?
  18. 编写代码实现对多边形图案填充
  19. python 代理ip群发邮件1000人_python 群发邮件数量限制_qq邮箱群发邮件的数量和速度限制是多少?...
  20. 数据中心市场或迎新变局,华为数字能源、中金数据“一起向未来”

热门文章

  1. 《看聊天记录都学不会C语言?太菜了吧》(5)打了一把游戏我学会了一个编程知识?
  2. 怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...
  3. char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完...
  4. java 只有日期的类_JAVA日期和时间类彻底解决(1)[转]
  5. 如果这个世界都不按套路出牌将会变成怎么样。。。 | 今日最佳
  6. 利用11行Python代码,盗取了室友的U盘,内容十分刺激!
  7. html5中表格如何等分,纯css3饼图五等分
  8. matlab井深测量,一种井深测量系统及方法与流程
  9. 前端对div连线_《前端图形学从入门到放弃》003 三维世界
  10. 数据结构——最短路径之Dijkstra算法(与最小生成树的prime算法很像,建议一起看)