首页 > 其他分享 >索引下推

索引下推

时间:2023-06-20 10:55:56浏览次数:24  
标签:level 下推 查询 回表 索引 server

什么是索引下推

索引条件下推,也叫索引下推,英文全称Index Condition Pushdown,简称ICP。

索引下推是MySQL5.6新添加的特性,用于优化数据的查询。

在MySQL5.6之前,通过使用非主键索引进行查询的时候,存储引擎通过索引查询数据,然后将结果返回给MySQL server层,在server层判断是否符合条件

在MySQL5.6及以上版本,可以使用索引下推的特性。当存在索引的列做为判断条件时,MySQL server将这一部分判断条件传递给存储引擎,然后存储引擎会筛选出符合MySQL server传递条件的索引项,即在存储引擎层根据索引条件过滤掉不符合条件的索引项,然后回表查询得到结果,将结果返回给MySQL server。

可以看到,有了索引下推的优化,在满足一定的条件下,存储引擎层会在回表查询之前对数据进行过滤,可以减少存储引擎回表查询的次数

举个例子

假设有一张用户信息表user_info,有三个字段name, level, weapon(装备),建立联合索引(name, level),user_info表初始数据如下:

idnamelevelweapon
1 大彬 1 键盘
2 盖聂 2 渊虹
3 卫庄 3 鲨齿
4 大铁锤 4 铁锤

 

 

 

 

 

那么这条SQL具体会怎么执行呢?

下面分情况进行分析。

先来看看MySQL5.6以前的版本

前面提到MySQL5.6以前的版本没有索引下推,其执行过程如下:

 查询条件name LIKE "大%" 不是等值匹配,根据最左匹配原则,在(name, level)索引树上只用到name去匹配,查找到两条记录(id为1和4),拿到这两条记录的id分别回表查询,然后将结果返回给MySQL server,在MySQL server层进行level字段的判断。整个过程需要回表2次

然后看看MySQL5.6及以上版本的执行过程,如下图。

 相比5.6以前的版本,多了索引下推的优化,在索引遍历过程中,对索引中的字段先做判断,过滤掉不符合条件的索引项,也就是判断level是否等于1,level不为1则直接跳过。因此在(name, level)索引树只匹配一个记录(id=1),之后拿着此记录对应的id回表查询全部数据,整个过程回表1次

可以使用explain查看是否使用索引下推,当Extra列的值为Using index condition,则表示使用了索引下推。

总结

从上面的例子可以看出,使用索引下推在某些场景下可以有效减少回表次数,从而提高查询效率。

 

标签:level,下推,查询,回表,索引,server
From: https://www.cnblogs.com/kisshappyboy/p/17493005.html

相关文章

  • mysql索引优化-收藏
    原文章:https://www.cnblogs.com/eryuan/p/17488732.htmlhttps://www.cnblogs.com/eryuan/p/17430377.html in/or到底能不能用索引参数range_optimizer_max_mem_size要控制范围优化器可用的内存,使用range_optimizer_max_mem_size系统变量:值为0表示“没有限制”。当值......
  • 外键要建立索引的原理和实验
    项目中,我们要求凡是有主子关系的表都要使用外键约束,来保证主子表之间关系的正确,不推荐由应用自己控制这种关系。但发现有时开发人员提交SQL语句时未必会注意外键列需要定义索引,或者不清楚为什么外键列需要建立索引,网上一些所谓的“宝典”也会将外键列建索引作为其中的一条,包括TOM大......
  • 通过索引提升SQL性能案例一则
    最近有个应用,前端调用后台的一个逻辑很慢,请开发提供了对应逻辑使用的SQL,进行脱敏,示例如下,selectt.AGENTasagent,nvl(sum(casewhent.operation_type='A'then1else0end),0)asDflCount,nvl(sum(casewhent.operation_type=......
  • mysql中的索引
    1、索引是什么?在mysql当中,内部系统它有两种查询方式,一种是(全盘扫描查询),另外一种是通过(索引检索查询),通过添加了索引的字段进行查询,可以大大提高查询效率mysql中的索引相当于一本书中的目录,通过索引查询数据类似于与通过书的目录查找内容,查询速度可以大大增加。MySQL中的索引......
  • 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用
    目录0.简介1.主键2.唯一索引3.联合索引4.索引对数据库操作的影响5.其他索引5.1普通索引5.2全文索引5.3前缀索引6.总结7.参考资料0.简介索引是一类特殊的文件,用来存储检索信息,使数据库查找更加快速。1.主键主键是一类特殊的唯一索引,选择某一列元素作为主键,用来表......
  • 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用
    (【后端面经】MySQL主键、唯一索引、联合索引的区别和作用)0.简介索引是一类特殊的文件,用来存储检索信息,使数据库查找更加快速。1.主键主键是一类特殊的唯一索引,选择某一列元素作为主键,用来表示每一行元素的特殊性,其特点如下在一个数据表中只有一个主键;主键不能为空(null);......
  • MySQL-hash索引
    1哈希索引原理哈希索引原理其实就是hash表,搜索时间效率O(1),搜索效率好,也意味着磁盘IO花费少,mysql底层使用的是链式哈希表,结构如下,每一个bucket就是一个个哈希桶,也就是哈希链表的头结点。哈希结构天然的需要耗费空间资源,是一种用空间换时间的做法2哈希要点:解决哈希冲突的几种方式再......
  • in用不用索引,啥时候能用啥时候不能用,一文说清
    in/or到底能不能用索引应该是肯定的,但有时生效有时不生效,这个能不能量化计算?这是本文想讨论和解答的问题。in到底用不用索引感觉像一桩悬疑片!古早时期的面经,统一说不走索引,在一些程序员脑海中从此留下不可磨灭的印记。有些从业时间较长的程序员脑子里的第一反应就是不走索引,上......
  • 【ElasticSearch】索引(添加)
    【ElasticSearch】索引(添加)RESTAPIPUT/myindex{"settings":{"index":{"number_of_shards":3,"number_of_replicas":3}},"mappings":{"properties":{"......
  • KingbaseES数据库分区表添加主键与索引的建议
    一、初始化测试环境#数据库版本信息KingbaseESV008R006C007B0012onx86_64-pc-linux-gnu,compiledbygcc(GCC)4.1.220080704(RedHat4.1.2-46),64-bit1.创建分区表:createtabletb(idbigint,statdate,nobigint,pdatedate,infovarchar2(50))partitionbyra......