mysql覆盖索引详解_mysql倒排索引

mysql覆盖索引详解_mysql倒排索引覆盖索引概念: MySQL可以利用索引返回select列表中的字段值(就是索引值)。而不必根据主键再次读取聚簇索引数据文件查到数据,也就是平时所说的不需要回表操作。覆盖索引其实是索引覆盖的意思,索引…

	mysql 14 覆盖索引+回表[数据库教程]

覆盖索引概念:

    MySQL可以利用索引返回select列表中的字段值(就是索引值)。而不必根据主键再次读取聚簇索引数据文件查到数据,也就是平时所说的不需要回表操作。覆盖索引其实是索引覆盖的意思,索引字段就已经囊括select查询的字段,即索引字段覆盖了需查询的字段。
 
可以看一个例子

举个栗子,假如有一张表:tableA

t(id PK, name KEY, sex, flag);  即id是聚集索引,name是普通索引。

分别执行2条SQL

SQL1 :   select id,name from  tableA  where name=‘shenjian‘

SQL2 :    select id,name,sex from tableA  where name=‘shenjian‘

结果是  SQL1查询速度极快,比SQL快很多,数据越多差异越明显,那这是为什么? 就因为多了一列?

 

这要从InnoDB的实现说起,

InnoDB有两大类索引:

  • 聚集索引(clustered index)

  • 普通索引 也叫非聚集索引(secondary index)

 

一张表必然有1个聚集索引(一颗B+树,叶子节点放的数据)

而普通索引的话,是在普通索引这颗B+树上,InnoDB普通索引的叶子节点存储主键值。

这是上面列子的表的聚簇索引,和普通索引

技术图片

          聚集索引图                        非聚集索引(普通索引)图

两个B+树索引分别如上图:

(1)id为PK,聚集索引,叶子节点存储行记录(按页);

(2)name为KEY,普通索引,叶子节点存储PK值,即id;

既然从普通索引无法直接定位行记录,那普通索引的查询过程是怎么样的呢?

通常情况下,需要扫码两遍索引树。

例如:

select * from t where name=‘lisi‘  是如何查找的呢

 技术图片

粉红色路径,需要扫码两遍索引树:

(1)右边的树(普通索引),先通过普通索引定位到主键值id=5;

(2)在通过主键的值在聚集索引的树里定位到行记录;

这就是所谓的回表查询先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

 

二、什么是索引覆盖****(Covering index)****?

    只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。

覆盖索引其实是索引覆盖的意思,索引字段就已经囊括select查询的字段,即索引字段覆盖了需查询的字段。

三、如何实现索引覆盖?

常见的方法是:将被查询的字段,建立到联合索引里去。

select id,name from user where name=‘shenjian‘;

能够命中name索引,索引叶子节点存储了主键id,通过name的索引树即可获取id和name,无需回表,符合索引覆盖,效率较高。


作者:Harri2012

链接:https://www.jianshu.com/p/8991cbca3854

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

mysql 14 覆盖索引+回表

原文地址:https://www.cnblogs.com/hup666/p/13420290.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6914.html

(0)
上一篇 2023-03-31
下一篇 2023-03-31

相关推荐

  • MySQL 50题练习

    MySQL 50题练习 表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name…

    2023-02-21
    127
  • Python实战|利用Dowhy框架实现因果推断实战(二)「建议收藏」

    Python实战|利用Dowhy框架实现因果推断实战(二)「建议收藏」文章来源:gzh数据万花筒 文章链接:https://mp.weixin.qq.com/s/7uBQ3_sR2j_zxH8mj7nKeQ 点击上方蓝字关注我们 因果推断系列文章分为上下两篇,目录结构如

    2023-04-16
    167
  • Python工程师

    Python工程师随着信息技术的快速发展,越来越多企业开始注重数据分析能力。Python作为一种流行的编程语言,以其简洁、易读、易学、高效的特性在企业中越来越受欢迎,进而催生了一些新兴职业,如Python工程师。Python工程师也成为了近几年IT行业中一种炙手可热的职业。

    2024-04-26
    70
  • Pycharm启动失败问题解决方法

    Pycharm启动失败问题解决方法a href=”https://www.python100.com/a/sm.html”font color=”red”免责声明/font/a a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-09-10
    24
  • MySQL教程90-MySQL视图是什么?[亲测有效]

    MySQL教程90-MySQL视图是什么?[亲测有效]
    MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表…

    2023-04-05
    152
  • 使用Python randomchoice生成随机选项

    使用Python randomchoice生成随机选项在日常生活中,我们可能需要在一些场景中随机选择一个选项。比如抽奖、给出一些随机建议等等。Python的random模块中提供了一个非常方便的函数——random.choice(),可以帮助我们实现这一需求。

    2024-05-30
    67
  • 以Python判断数字为中心的方法

    以Python判断数字为中心的方法在日常生活中,我们经常需要找出给定数字数组或序列的中心位置,然后在此基础上进行特定的处理。这时候,一个简单而高效的算法可以帮助我们快速地找到数字的中心位置,这就是本文所要介绍的“以Python判断数字为中心的方法”。

    2024-08-07
    30
  • [redis]SDS和链表[通俗易懂]

    [redis]SDS和链表[通俗易懂]一、SDS 1、SDS结构体 redis3.2之前 :不管buf的字节数有多少,都用 4字节的len来储存长度 ,对于只存短字符串那么优点 浪费空间 ,比如只存 ,则 则只需要一个字节8位即可表示 r

    2023-02-23
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注