首页 > 其他分享 >回表和索引覆盖

回表和索引覆盖

时间:2023-05-17 10:11:45浏览次数:43  
标签:结点 code 覆盖 聚簇 回表 索引 select

聚簇索引和非聚簇索引


先理解MySQL B+树的原理
mysql有很多索引,每一个索引自成一个树结构
1.加载数据时,先加载聚簇索引(一般来说,聚簇索引为该表的主键),非叶子节点存储叶子结点的地址,叶子结点存储聚簇索引值和该条数据的所有字段值
2.然后加载非聚簇索引(一般来说是除主键之外的唯一索引 普通索引等所有索引, 非聚簇索引也叫二级索引),非叶子节点存储叶子结点的地址,叶子结点存储索引的值和该条数据对应的聚簇索引的值

 

 

回表
如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,
如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。

where后面使用非聚簇索引,并且select的字段有除了该非聚簇索引树之外的字段(也就是在该非聚簇索引的数据, 取不到所有select的字段)就会回表
-->找到非聚簇索引树的叶子结点,拿到聚簇索引的值;再去聚簇索引树根据聚簇索引的值查到叶子结点,拿到该条数据的值(回表)
比如说code是索引 select code,name from table where code = '...'; name值在code索引树拿不到,就会拿着code的叶子结点存储的id值, 去id的索引树在查, 这个就叫回表

题外话(where后面没有使用任何索引:直接遍历聚簇索引树的叶子结点,拿到该条数据的值)

 

 


索引覆盖
为了避免回表,这里就引出了索引覆盖的解决方案
只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。触发索引覆盖,explain的输出结果Extra字段为Using index。
当select字段值为多个时,可以建立联合索引(核心解决方法)
还是这个例子 select code,name from table where code = '...'; 避免回表, 我们可以把code和name设置为联合索引, 这个就可以在code和name的联合索引树中取到select的所有字段,不用再去id树查

 

 

 

题外话(where后面没有使用任何索引:直接遍历聚簇索引树的叶子结点,拿到该条数据的值,不像索引查询,直接命中数据)
顺序查效率高
随机查(随机或者频繁查都会触发随机查)

主键自增(插入数据时,直接在尾部添加,不会移动树结构前面的节点)
UUID会在前面的节点插入,然后树会发生调整,量大时会有问题
业务允许时,可以主键自增,不允许就要慎用了

标签:结点,code,覆盖,聚簇,回表,索引,select
From: https://www.cnblogs.com/dzpykj/p/17407667.html

相关文章

  • MYSQL因IN的范围太大导致索引失效问题
    背景最近发现有个用于统计的门店串码激活数量的SQL特别慢,将其摘出来大致如下SELECTa.sku_idasskuId,a.store_idasstoreId,count(*)assaleQtyFROMall_imei_infoawherea.activated_time>=1675530000000anda.activated_time<=1675616399999anda.stor......
  • 几大索引失效原因
    1.带头大哥不能死这局经典语句是说创建索引要符合最左侧原则。例如表结构为u_id,u_name,u_age,u_sex,u_phone,u_time创建索引为idx_user_name_age_sex。查询条件必须带上u_name这一列。2.不在索引列上做任何操作不在索引列上做任何计算、函数、自动或者手动的类型转换,否则会进行全表扫......
  • python3 获取mongodb表的索引
    说明:此处脚本考虑到mongodb里面数据存储的时区转换,mongodb里面的数据使用的是"格林威治"时间1#!/usr/bin/python323importpytz4frompymongoimportMongoClient56"""7/usr/bin/pip3install-Ivpytz-ihttp://pypi.douban.com/simple/--trusted-host......
  • 为什么被final修饰的方法不能被子类重写(无法被覆盖)
       方法覆盖是子类重写父类的方法实现。如果一个方法被final修饰,那么子类是无法重写该方法。注意final关键字只是让方法无法被覆盖,但不影响方法的继承。子类依旧可以继承父类的final方法,只是不能对其实现进行修改。好处就是:防止子类不经意间修改父类方法的实现,破坏了程序的正......
  • 使用xml更新solr索引
    使用xml更新solr索引Solr接受xml格式数据更新、提交、修改索引。 更新的Schema不要混淆SCHEMA.XMLadd/replacedocuments SimpleExample:<!--[if!supportLists]-->·<!--[endif]--><add><!--[if!supportLists]-->·<!--[endif]--><doc><!--[......
  • 如何使用IndexOf方法获取JS对象数组中的索引
    获得数组里某一个对象的索引的最佳方法是什么呢?比如如下场景:varhello={hello:'world',foo:'bar'};varqaz={hello:'stevie',foo:'baz'}varmyArray=[];myArray.push(hello,qaz);现在我想得到hello属性值是stevie的对象的索引。在这个例......
  • 索引组织表 Index Organizied Table 索引组织表 Index Organizied Table
     CREATETABLEt1(idINTPRIMARYKEY,cINT)ENGINE=Memory;CREATETABLEt2(idINTPRIMARYKEY,cINT)ENGINE=InnoDB;INSERTINTOt1VALUES(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);INSERTINTOt2VALUES(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(......
  • 魔术索引
    魔术索引。在数组A[0...n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。示例1:输入:nums=[0,2,3,4,5]输出:0说明:0下标的元素为0......
  • 几个主要搜索引擎(Google和百度、雅虎)的站内搜索代码
    几个主要搜索引擎(Google和百度、雅虎)的站内搜索代码,使用时只需要将代码里的"www.williamlong.info"替换成你的网址即可。<!--Google站内搜索开始--><formmethod=getaction="http://www.google.com/search"><inputtype=textname=q><inputtype=submitname=btnGvalue="......
  • MySQL学习日志十三,索引
    一、索引的作用1.提高查询速度2.确保数据的唯一性3.可以加速表和表之间的连接,实现表与表之间的参照完整性4.使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间5.全文检索字段进行搜索优化.二、分类1.主键索引(PrimaryKey)2.唯一索引(Unique)3.常规......