返回顶部
首页 > 资讯 > 数据库 >Extra中出现的Using index condition到底什么意思?
  • 908
分享到

Extra中出现的Using index condition到底什么意思?

mysql数据库database 2023-09-10 07:09:28 908人浏览 薄情痞子
摘要

我们兴致勃勃地建了一张InnoDB表,想测试一下索引的性能,对表中的聚簇索引肆意妄为,对id执行各种查询,玩得不亦乐乎。 这时候,你突发奇想,在表上建了个二级索引,执行了一下查询,发现Extra列里面出现了你从未见过、书上也没讲到的Usin

我们兴致勃勃地建了一张InnoDB表,想测试一下索引的性能,对表中的聚簇索引肆意妄为,对id执行各种查询,玩得不亦乐乎。

这时候,你突发奇想,在表上建了个二级索引,执行了一下查询,发现Extra列里面出现了你从未见过、书上也没讲到的Using index condition。

你慌了,到网上找答案,找到的都是类似这样的东西:

你明白了,可是当你写了一个索引字段的范围查询后,面对着Extra中再次出现的Using index condition,又一次陷入了沉思······

其实,这个问题就是Mysql的版本问题,老版本中没有使用这样的优化算法,所以在老板本书上都很难发现。

Using index condition的出现,意味着mysql在执行这条语句时使用了Index Condition Pushdown Optimization(ICP),我愿意称之为”索引条件下压优化“。

这个优化的具体操作是这样的:

(先放一张Mysql层次图便于后面理解)

ICP用于当MySQL想要使用索引并且需要遍历表中的所有行的时候。如果没有ICP,存储引擎就会遍历通过索引定的行,并把这些行从表中返回到服务端,在服务端进行where条件的应用。

如果可以使用ICP,如果where条件可以被用于索引中存储的列,那么服务端就会将这一部分where条件压入存储引擎。然后存储引擎会在索引列上针对where条件进行筛选,只有某个索引列的值满足了条件,那么它背后所代表的行才能被读取。由此可见,ICP可以减少存储引擎访问存储系统(大概率是I/O操作)的次数和服务端访问存储引擎的次数。

Using index condition的出现,也就是ICP的使用情况,有以下几点注意事项:

  1. 当type为range,ref,eq_ref,ref_or_null的查询需要获取一个表中的所有行时会使用ICP。
  2. InnoDB和MyISAM的表都可以使用ICP,包括两种引擎各自的分区表。
  3. 对于InnoDB来说,ICP只能用于二级索引,因为ICP的目标时减少全表读取的次数并以此减少I/O操作的频率。对于InnoDB的聚簇索引来说,整个表的记录都已经读入InnoDB的缓冲区了,再使用ICP已经无法减少I/O操作了。
  4. ICP不能在虚拟列的二级索引上使用。(只有InnoDB支持在虚拟列上建立二级索引)
  5. 子查询的where条件无法下压。
  6. 引用已经建立的函数的where条件无法下压,存储引擎无法解析或执行函数。
  7. 触发器类型条件不能下压。

为了更好地理解这个优化是如何工作的,我们先来看没有ICP的where查询中,索引扫描是如何进行的:

  1. 获取表中下一行(先获取索引,然后通过索引来定位并扫描全表)
  2. 根据where条件筛选刚刚获取的表中的行,得到结果集。

如果使用ICP的话,这个流程将变为:

  1. 获取下一行的索引(不是整个行)
  2. 将where条件下压到存储引擎,测试这个索引是否满足where条件,若不满足,则直接继续检查索引中的下一行。
  3. 如果满足,再去获取整个表中的所有行。
  4. 根据where条件筛选刚刚获取的表中的行,得到结果集。

举个栗子:

假设有一个表包含了一个人的住址信息,然后在其上建立了一个索引:

INDEX ( zipcode , lastname ,  firstname ) 

然后我们执行以下查询:

SELECT * FROM people  WHERE zipcode='95054'  AND lastname LIKE '%etrunia%'  AND address LIKE '%Main Street%';

小学二年级学过的知识告诉我们,这个查询没法用上我们的索引,因为lastname整了个通配符开头的LIKE,必须全表扫。

可是现在我们有ICP了,MySQL会在使用索引查找zipcode之后,检查这些索引列中是否满足last name LIKE "%etrunia%" ,而这个操作是在全表扫描之前的,也就是说,在这一步操作之后,我们就需要扫描满足条件的索引代表的行,不用进行全表扫描了,避免了我们读取满足zipcode条件,但是不满足lastname条件的行。

ICP默认使用,如果想要关闭或再打开,可以调用以下命令:

SET optimizer_switch = 'index_condition_pushdown=off';SET optimizer_switch = 'index_condition_pushdown=on';

 (10205101490 数据库报告一部分 从官网上读取文档总结在此)

来源地址:https://blog.csdn.net/ezioetay/article/details/125031492

您可能感兴趣的文档:

--结束END--

本文标题: Extra中出现的Using index condition到底什么意思?

本文链接: https://lsjlt.com/news/402047.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Extra中出现的Using index condition到底什么意思?
    我们兴致勃勃地建了一张InnoDB表,想测试一下索引的性能,对表中的聚簇索引肆意妄为,对id执行各种查询,玩得不亦乐乎。 这时候,你突发奇想,在表上建了个二级索引,执行了一下查询,发现Extra列里面出现了你从未见过、书上也没讲到的Usin...
    99+
    2023-09-10
    mysql 数据库 database
  • MySQL中int(n)后面的n到底代表的是什么意思
    你可能已经知道int(1)这个长度1并不代表允许存储的宽度! 但对这个长度很多人也没有真正研究过到底代表什么,今天我就来简单的分析一下! 先看一个简单的建表小案例: create table test( ...
    99+
    2022-05-30
    MySQL int(n)
  • JavaScript中的输出是什么意思
    这篇文章主要介绍“JavaScript中的输出是什么意思”,在日常操作中,相信很多人在JavaScript中的输出是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2024-04-02
  • navicat出现1130指的是什么意思
    小编给大家分享一下navicat出现1130指的是什么意思,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!用Navicat连接远程MySQL数据库时,有时会出现“Navicat for mysq...
    99+
    2024-04-02
  • 数据库中出现no database selected是什么意思?
    今天小编给大家分享的是数据库中出现no database selected是什么意思,很多人都不太了解,今天小编为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。no...
    99+
    2024-04-02
  • python中的% 是什么意思,起到什么作用呢
    python这款软件是很多程序员都会使用到的编程软件,利用python大家可以快速的编写代码,同时代码运行速度也是非常快的。在python中经常会有很多的符号、英文字母等等的,比如今...
    99+
    2022-12-26
    python中的% python中的%是什么意思 python中的%的作用
  • 出现cpu fan error错误指的是什么意思
    这篇文章将为大家详细讲解有关出现cpu fan error错误指的是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。出现cpu fan error说明CPU在开机自检时没有检测到风扇转速,解决方法:...
    99+
    2023-06-14
  • {template header}在文件第一句中出现是什么意思
    在文件第一句中出现的意思是指文件的开头部分的第一句话。通常情况下,文件的第一句用来介绍文件的内容、目的或者提供一些重要的信息。它可以...
    99+
    2023-08-08
    意思
  • linux中出现you have newmail in /var/spool/mail/root是什么意思
    这篇文章主要介绍“linux中出现you have newmail in /var/spool/mail/root是什么意思”,在日常操作中,相信很多人在linux中出现you have newmail in /var/spool/mail...
    99+
    2023-06-06
  • 在C#的字符串中找到{0}是什么意思
    在C#的字符串中,"{0}"表示一个占位符,用于将变量或表达式的值插入到字符串中的特定位置。这种语法通常用于格式化字符串,其中大括号...
    99+
    2023-09-17
    C#
  • go version -m 输出中的箭头符号“=>”是什么意思?
    php小编草莓在这里为大家解答一个关于Go语言的疑问:在运行`go version -m`命令时,输出中的箭头符号"=>"代表的含义是什么呢?这个符号实际上是用来表示包的依赖关系...
    99+
    2024-02-09
    go语言
  • windows中无法找到脚本文件指的是什么意思
    这篇文章主要讲解了“windows中无法找到脚本文件指的是什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“windows中无法找到脚本文件指的是什么意思”吧!无法找到脚本文件是什么意思...
    99+
    2023-07-02
  • HTTP服务器连接不上出现的状态代码表示什么意思
    这篇文章主要讲解了“ HTTP服务器连接不上出现的状态代码表示什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ HTTP服务器连接不上出现的状态代码表示什么意思”吧!500 服务器内部...
    99+
    2023-06-07
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作