iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >一篇文章读懂什么是MySQL索引下推(ICP)
  • 406
分享到

一篇文章读懂什么是MySQL索引下推(ICP)

2024-04-02 19:04:59 406人浏览 八月长安
摘要

目录一、简介 二、原理 三、实践 3.1 不使用索引下推 3.2 使用索引下推 四、使用条件 五、相关系统参数 总结一、简介 ICP(Index Condition Pushdow

一、简介

ICP(Index Condition Pushdown)是在Mysql 5.6版本上推出的查询优化策略,把本来由Server层做的索引条件检查下推给存储引擎层来做,以降低回表和访问存储引擎的次数,提高查询效率。

二、原理

为了理解ICP是如何工作的,我们先了解下没有使用ICP的情况下,mysql是如何查询的:

  • 存储引擎读取索引记录;
  • 根据索引中的主键值,定位并读取完整的行记录;
  • 存储引擎把记录交给Server层去检测该记录是否满足WHERE条件。

使用ICP的情况下,查询过程如下:

  • 读取索引记录(不是完整的行记录);
  • 判断WHERE条件部分能否用索引中的列来做检查,条件不满足,则处理下一行索引记录;
  • 条件满足,使用索引中的主键去定位并读取完整的行记录(就是所谓的回表);
  • 存储引擎把记录交给Server层,Server层检测该记录是否满足WHERE条件的其余部分。

三、实践

先创建一张表,并插入记录


CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT COMMENT "主键",
name varchar(32)  COMMENT "姓名",
city varchar(32)  COMMENT "城市",
age int(11)  COMMENT "年龄",
primary key(id),
key idx_name_city(name, city)
)engine=InnoDB default charset=utf8;

insert into user(name, city, age) values("ZhaoDa", "BeiJing", 20),("QianEr", "ShangHai", 21),("SunSan", "GuanZhou", 22), ("LiSi", "ShenZhen", 24), ("ZhouWu", "NingBo", 25),  ("WuLiu", "HangZhou", 26), ("ZhengQi", "NanNing", 27), ("WangBa", "YinChuan", 28), ("LiSi", "TianJin", 29), ("ZhangSan", "NanJing", 30), ("CuiShi", "ZhengZhou", 65),  ("LiSi", "KunMing", 29), ("LiSi", "ZhengZhou", 30);

查看一下表记录


mysql> select * from user;
+----+----------+-----------+------+
| id | name     | city      | age  |
+----+----------+-----------+------+
|  1 | ZhaoDa   | BeiJing   |   20 |
|  2 | QianEr   | ShangHai  |   21 |
|  3 | SunSan   | GuanZhou  |   22 |
|  4 | LiSi     | ShenZhen  |   24 |
|  5 | ZhouWu   | NingBo    |   25 |
|  6 | WuLiu    | HangZhou  |   26 |
|  7 | ZhengQi  | NanNing   |   27 |
|  8 | WangBa   | YinChuan  |   28 |
|  9 | LiSi     | TianJin   |   29 |
| 10 | ZhangSan | NanJing   |   30 |
| 11 | CuiShi   | ZhengZhou |   65 |
| 12 | LiSi     | KunMing   |   29 |
| 13 | LiSi     | ZhengZhou |   30 |
+----+----------+-----------+------+
13 rows in set (0.00 sec)

注意,这张表里创建了联合索引(name, city),假设我们想查询如下语句:


select * from user where name="LiSi" and city like "%Z%" and age > 25;

3.1 不使用索引下推

在不使用索引下推的情况下,根据联合索引“最左匹配”原则,只有name列能用到索引,city列由于是模糊匹配,是不能用到索引的,此时的执行过程是这样的:

  1. 存储引擎根据(name, city)联合索引,找到name值为LiSi的记录,共4条记录;
  2. 然后根据这4条记录中的id值,逐一进行回表扫描,去聚簇索引中取出完整的行记录,并把这些记录返回给Server层;
  3. Server层接收到这些记录,并按条件name="LiSi" and city like "%Z%" and age > 25进行过滤,最终留下("LiSi", "ZhengZhou", 30)这条记录。

画张图看一下:

未使用使用索引条件下推

3.2 使用索引下推

使用索引下推的情况下,执行过程是这样的:

  • 存储引擎根据(name, city)联合索引,找到name='LiSi'的记录,共4条;
  • 由于联合索引中包含city列,存储引擎直接在联合索引中按city like "%Z%"进行过滤,过滤后剩下2条记录;
  • 根据过滤后的记录的id值,逐一进行回表扫描,去聚簇索引中取出完整的行记录,并把这些记录返回给Server层;
  • Server层根据WHERE语句的其它条件age > 25,再次对行记录进行筛选,最终只留下("LiSi", "ZhengZhou", 30)这条记录。

画张图看一下:


使用索引条件下推

另外,从执行计划里也可以看到使用了索引下推(Extra里显示Using index condition)


mysql> explain select * from user where name="LiSi" and city like "%Z%" and age > 25;
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra                              |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+------------------------------------+
|  1 | SIMPLE      | user  | NULL       | ref  | idx_name_city | idx_name_city | 99      | const |    4 |     7.69 | Using index condition; Using where |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+------------------------------------+
1 row in set, 1 warning (0.00 sec)

四、使用条件

  • 只能用于range、 ref、 eq_ref、ref_or_null访问方法;
  • 只能用于InnoDB和 MyISAM存储引擎及其分区表;
  • 对InnoDB存储引擎来说,索引下推只适用于二级索引(也叫辅助索引);

tip:索引下推的目的是为了减少回表次数,也就是要减少IO操作。对于InnoDB的聚簇索引来说,完整的行记录已经加载到缓存区了,索引下推也就没什么意义了。

  • 引用了子查询的条件不能下推;
  • 引用了存储函数的条件不能下推,因为存储引擎无法调用存储函数。

五、相关系统参数

索引条件下推默认是开启的,可以使用系统参数optimizer_switch来控制器是否开启。

查看默认状态:


mysql> select @@optimizer_switch\G;
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_uNIOn=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on
1 row in set (0.00 sec)

切换状态:


set optimizer_switch="index_condition_pushdown=off";
set optimizer_switch="index_condition_pushdown=on";

总结

到此这篇关于什么是MySQL索引下推(ICP)的文章就介绍到这了,更多相关MySQL索引下推(ICP)内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 一篇文章读懂什么是MySQL索引下推(ICP)

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章读懂什么是MySQL索引下推(ICP)
    目录一、简介 二、原理 三、实践 3.1 不使用索引下推 3.2 使用索引下推 四、使用条件 五、相关系统参数 总结一、简介 ICP(Index Condition Pushdow...
    99+
    2024-04-02
  • 一篇文章带你掌握MySQL索引下推
    目录1.什么是索引下推2.案例2.1.mysql5.5版本2.2.MySQL5.7版本3.小结1.什么是索引下推 索引下推(Index Condition PushDown,简称ICP)是从MySQL5.6开始引入的一个...
    99+
    2022-12-21
    MySQL索引下推 MySQL索引
  • 一文读懂 MySQL 中的索引
    文章目录 1. 索引概述1.1 索引概述1.2 优点1.3 缺点1.6 常见索引概念1.6.1 聚簇索引1.6.2 二级索引(辅助索引、非聚簇索引)1.6.3 联合索引 1.8 MyISAM索引的原理1.9 MyISAM 与 ...
    99+
    2023-08-16
    mysql android 数据库
  • 一篇文章讲解清楚MySQL索引
    目录一丶什么是索引二丶索引的数据结构1.哈希表2.有序数组3.跳表4.平衡二叉搜索树5.B-树,B+树三丶InnoDB索引方案1.InnoDB行结构2.InnoDB页结构2.1行结构...
    99+
    2022-11-13
    MySQL索引 MySQL索引详解 mysql索引教程
  • MySQL索引下推是什么
    本文小编为大家详细介绍“MySQL索引下推是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL索引下推是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。SELEC&...
    99+
    2024-04-02
  • 还是搞不懂Anaconda是什么?读这一篇文章就够了
    文章目录 1 Anaconda介绍2 conda介绍3 安装Anaconda4 Anaconda的使用配置Anaconda源 5 创建虚拟环境并使用5.1 创建虚拟环境5.2 查看所有环境...
    99+
    2023-09-01
    python 学习
  • 一篇文章看懂MySQL主从复制与读写分离
    目录引言一、MySQL主从复制1、MySQL的复制类型2、MySQL主从复制的原理3、MySQL主从复制延迟二、MySQL读写分离1、常见的 MySQL 读写分离分2、MySQL 读...
    99+
    2024-04-02
  • MySQL——图文版搞懂MySQL的索引是什么?
    按数据结构分类可分为:B+tree 索引、 Hash 索引、 Full-text 索引。按物理存储分类可分为:聚簇索引(主键索引)、二级索引(辅助索引)。按字段特性分类可分为:主键索引、普通索引、前缀...
    99+
    2023-10-26
    mysql 数据库
  • [Hive]一篇带你读懂Hive是什么
    ✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: ...
    99+
    2023-10-23
    hive hadoop big data
  • Mysql索引下推有什么作用
    这篇文章主要讲解了“Mysql索引下推有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql索引下推有什么作用”吧!导读索引下推(index c...
    99+
    2024-04-02
  • 一篇文章帮你搞懂什么是java的进程和线程
    目录为什么会有进程进程的概念进程的特征线程线程的结构进程之中创建线程的优点进程和线程的区别进程和线程之间的关系总结为什么会有进程 在简单的批处理操作系统中,作业时串行执行的,即一个作...
    99+
    2024-04-02
  • cookie是什么?有什么用?cookie详解,一篇文章彻底搞懂cookie
    Cookie是什么         cookie的中文翻译是曲奇,小甜饼的意思。cookie其实就是一些数据信息,类型为“小型文本文件”,存储于电脑上的文本文件中。 Cookie有什么用         我们想象一个场景,当我们打开一个网...
    99+
    2023-08-31
    java 服务器 后端 网络协议
  • 还不知道Anaconda是什么?读这一篇文章就够了
    目录1 Anaconda介绍概述特点2 conda介绍3 安装Anaconda4 Anaconda的使用配置Anaconda源5 创建虚拟环境并使用5.1 创建虚拟环境5.2 查看所...
    99+
    2023-02-17
    anaconda使用方法 anaconda怎么用 anaconda3使用
  • 什么是CDN一文带您读懂CDN
    CDN(Content Delivery Network)是一种基于网络的技术,用于提高网站的访问速度和性能。CDN通过将网站的静态...
    99+
    2023-09-23
    CDN
  • mysql索引文件是什么
    MySQL索引文件是用于快速查找和检索数据库中数据的数据结构,它是在表中的一个或多个列上创建的,以提高查询性能和数据检索速度,包含了索引键值和指向实际数据位置的指针,索引文件通常存储在磁盘上,与表数据文件分开存储。本教程操作系统:Windo...
    99+
    2023-08-02
  • 怎么用PHP+Mysql实现查询上一篇和下一篇文章的功能
    本篇内容介绍了“怎么用PHP+Mysql实现查询上一篇和下一篇文章的功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • mysql中什么是全文索引
    这篇文章将为大家详细讲解有关mysql中什么是全文索引,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、说明MyISAM存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。...
    99+
    2023-06-15
  • MySQL唯一索引指的是什么
    这篇文章给大家分享的是有关MySQL唯一索引指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个...
    99+
    2024-04-02
  • WAF是什么?一篇文章带你全面了解WAF
    WAF是什么?一篇文章带你全面了解WAF 文章目录 WAF是什么?一篇文章带你全面了解WAFWAF是什么?一、WAF的工作原理二、WAF的分类三、WAF的特点四、如何选择和部署WAF WAF是什么? Web应用程序防火墙(W...
    99+
    2023-08-21
    服务器 前端 网络 安全 web安全
  • mysql全文索引是什么意思
    mysql 全文索引是一种特殊索引,用于提高全文搜索性能,通过存储单词的前缀来工作。它提供快速全文搜索、简易查询和部分匹配。要创建全文索引,可以使用 create fulltext in...
    99+
    2024-04-22
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作