`
student_lp
  • 浏览: 429119 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

    通常大家都会根据查询的where条件来创建合适的索引,不过这只是索引优化的一个方面。索引确实是一种查找数据的高效方式,但是mysql也可以使用索引来直接获取列的数据,这样就不再需要读取数据行。如果索引的叶子节点中已经包含要查询的数据,那么还有什么必要再回表查询呢?如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为“覆盖索引”。

一、覆盖索引的优点

    覆盖索引是非常有用的工具,能够极大的提高性能。如果查询只需要扫描索引而无需回表,会带来多少好处:

  • 索引条目通常远小于数据行大小,所以如果只需读取索引,那mysql就会极大的减少数据访问量。这对缓存的负载非常重要,因为这种情况下响应时间大部分花费在数据拷贝上。覆盖索引对于I/O密集型的应用也很有帮助,因为索引比数据更小,更容易全部放入内存中。
  • 因为索引是按照列值顺序存储的,所以对于I/O密集型的范围查询会比随机从磁盘读取每一行数据的I/O要少的多。对于某些存储引擎,例如MyISAM,甚至可以通过optimize命令使得索引完全顺序排列,这让简单的范围查询能使用完全顺序的索引访问。
  • 一些存储引擎如MyISAM在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用。这可能会导致严重的性能问题,尤其是那些系统调用占用了数据访问中的最大开销的场景。
  • 由于InnoDB的聚簇索引,覆盖索引对InnoDB特别有用。InnoDB的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询。

二、覆盖索引的适用范围

    不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以mysql只能使用B-Tree索引做覆盖索引。另外,不同的存储引擎实现覆盖索引的方式也不同,而且不是所有的引擎都支持覆盖索引。

三、有关覆盖索引的优化问题

    当发起一个被索引覆盖的查询时,在EXPLAIN的extra列可以看到“Using index”的信息。索引覆盖查询还有很多陷阱可能会导致无法实现优化。MySQL查询优化器会在执行查询前判断是否有一个索引能进行覆盖。假设索引覆盖了where条件中的字段,但不是整个查询涉及的字段。如果条件为假,MySQL5.5或更早的版本也总是会回表获取数据行,尽管并不需要这一行且最终会被过滤掉。

    为什么会发生这样的情况,以及如何重写查询以解决该问题?这里索引无法覆盖该查询,有两个原因:

  • 没有任何索引能够覆盖这个查询。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。不过,理论上MySQL还有一个捷径可以利用:where条件中的列是有索引可以覆盖的,因此MySQL可以使用该索引找到对应的索引列数据并检查索引列上列数据是否匹配,过滤之后再读取需要的数据行。
  • MySQL不能在索引中执行like操作。这是底层存储引擎API的限制,MySQL5.5和更早的版本中只允许在索引中做简单比较操作(例如等于、不等于以及大于)。MySQL能在索引中做最左前缀匹配的like比较,因为该操作可以转换为简单的比较操作,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配。这种情况下,MySQL服务器只能提取数据行的值而不是索引值来做比较。

    其实也有办法解决上面所说的两个问题,需要重写查询并巧妙的设计索引。看下面的例子:

1、首先将索引扩展至覆盖三个数据列(actor、title、prod_id)

2、然后按照如下方式重写查询:select * from products join (select prod_id from products where actor='sean_carrey' and title like '%apollo%' ) as t1 on (t1.prod_id = products.prod_id);

    这种方式叫做延迟关联,因为延迟了队列的访问。在查询的第一阶段MySQL可以使用覆盖索引,在from子句的子句中找到匹配的prod_id,然后根据这些prod_id值在外层查询匹配所需要的所有列值。虽然无法使用覆盖索引覆盖整个查询,但总算比完全无法利用覆盖索引的好。

    在大多数存储引擎中,覆盖索引只能覆盖那些只访问索引中部分列的查询。不过,可以更进一步优化InnoDB。回想一下,InnoDB的二级索引的叶子节点包含了主键的值,这意味着InnoDB的二级索引可以有效的利用这些“额外”的主键列来覆盖查询。

分享到:
评论

相关推荐

    Mysql覆盖索引详解

    如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表操作 判断标准 使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL...

    MySQL组合索引与最左匹配原则详解

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏...覆盖索引:假如查询SELECT col1, col2, col3 FROM 表名,由于查询的字段存在索引页中,那

    MongoDB数据库中索引(index)详解

    三星:如果索引中包含查询中所需要的全部数据:(覆盖索引) DBA书:关系型数据库索引设计与优化 索引类别: 顺序索引 散列索引:将索引映射至散列桶上,映射是通过散列函数进行的 评估索引的标准: 访问类型:做...

    MySQL详解视频.zip

    覆盖索引 索引下推 oMySql架构设计之Innodb深入解剖 Buffer Pool Free链表 Flush链表 Lru链表 Redo Log log buffer 事务提交 Undo Log 事务回滚 DoubleWite Buffer Change Buffer oMySql...

    详解SQL Server的聚焦过滤索引

    这一节我们还是继续讲讲索引知识,前面我们聚集索引、非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解。 过滤索引,在查询条件上创建非聚集索引(1...

    MySQL的索引详解

    要理解MySQL中索引的工作原理,最简单的方法就是去看一看一本书的索引部分:比如你想在一本书中寻找某个主题,一般会先看书的索引目录,找到对应的章节、对应的页码后就可以快速找到你想看的内容。 在MySQL中,存储...

    Mysql查询优化从入门到入土详解含示例(值得珍藏)

    我们介绍了查询优化技术的各个方面,包括索引、查询语句、表结构等基本优化方法以及高级优化技术如查询缓存、数据库分区、使用覆盖索引和使用压缩技术等。通过合理应用这些优化技术,可以提高数据库的响应速度、降低...

    MySQL索引背后的数据结构及算法原理详解

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。...第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引的架构实现讨论聚集索引、非聚集索引及覆盖索引等话题。 第三部

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    文章目录测试数据1 sql执行顺序2 order by 和 group by什么时候会...— 其实为3.1.1的特例3.1.3 覆盖索引情况下和非覆盖索引情况下稍微有点区别3.2 会出现 Using filesort的情况3 讨论 — 实际业务中我的order by 就

    安防天下智能网络视频监控技术详解与实践part2

    8.3.1 覆盖范围 238 8.3.2 图像细部特征 239 8.3.3 数字云台功能 239 8.3.4 视频校正与处理 240 8.3.5 360°全景摄像机 241 8.4 高清摄像机的关键技术 241 8.4.1 高清配套镜头 242 8.4.2 图像传感器 ...

    安防天下智能网络视频监控技术详解与实践.part3

    第1章 视频监控技术概述 1 1.1 引子 2 1.1.1 安全防范的雏形 2 1.1.2 网络视频监控 2 1.1.3 智能视频识别 2 1.1.4 智能网络视频监控 3 1.2 视频监控技术发展过程 3 ...11.6.6 模糊索引功能 369 11.7 cms平台...

    MySQL第二天:查询,索引及优化

    文章目录慢查询慢查询配置慢查询解读慢查询工具mysqldumpslowpt_query_digest索引聚簇索引跟非聚簇索引聚簇索引非聚簇索引:覆盖索引(Covering Index)总结:重点执行计划执行计划详解重点 MySQL优化参考 ...

    python爬虫详解.pdf

    另外⼀些不常使⽤的名字还有蚂蚁、⾃动索引、模拟程序或者蠕 ⾍。随着⽹络的迅速发展,万维⽹成为⼤量信息的载体,如何有效地提取并利⽤这些信息成为⼀个巨⼤的挑战。例如:传统的通⽤搜索引擎 AltaVista,Yahoo!和...

    Oracle语句优化30个规则详解

    你当然也在SQL句级或是会话(session)级对其进行覆盖。  为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。  ...

    oracle详解

    DESTROY 覆盖表空间数据文件 (N) INDEXFILE 将表/索引信息写入指定的文件 SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N) ANALYZE 执行转储文件中的 ANALYZE 语句 (Y) FEEDBACK 显示每 x 行 (0) 的进度 TOID_...

    安防天下智能网络视频监控技术详解与实践part1

    8.3.1 覆盖范围 238 8.3.2 图像细部特征 239 8.3.3 数字云台功能 239 8.3.4 视频校正与处理 240 8.3.5 360°全景摄像机 241 8.4 高清摄像机的关键技术 241 8.4.1 高清配套镜头 242 8.4.2 图像传感器 ...

    入门学习Linux常用必会60个命令实例详解doc/txt

    入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不...

    oracle 数据库优化技术资料

    你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果...

    Android 应用的安装过程详解

    .apk里面的.arsc是资源的索引,当资源比较多的时候,可以索引。 signing-签名,系统在确认应用被覆盖之前,除了检测包名是否一致,还会检测签名是否相同。所以签名是一个公司的机密,起到版权保护的作用。 我们部署...

Global site tag (gtag.js) - Google Analytics