当前位置: 首页 > news >正文

MySQL优化之索引下推

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨
👀👀👀 个人博客:小奥的博客
👍👍👍:个人CSDN
⭐️⭐️⭐️:传送门
🍹 本人24应届生一枚,技术和水平有限,如果文章中有不正确的内容,欢迎多多指正!
📜 欢迎点赞收藏关注哟! ❤️

文章目录

  • MySQL优化之索引下推
  • 一、概念
  • 二、验证
    • 2.1 建表语句
    • 2.2 关闭索引下推
    • 2.3 打开索引下推
  • 三、总结

MySQL优化之索引下推

一、概念

索引条件下推(Index Condition Pushdown),简称ICP。MySQL5.6新添加,用于优化数据的查询。

比如说有这样的场景:

有些搜索条件中虽然出现了索引列,但却不能使用到索引,比如下边这个查询:

SELECT * FROM table WHERE key1 = ‘z’ AND key1 LIKE ‘%a’;

其中的 key1 = 'z' 可以使用到索引,但是 key1 LIKE '%a' 却无法使用到索引,在以前版本的 MySQL 中,是按照下边步骤来执行这个查询的:

  • 先根据 key1 = 'z' 这个条件,从二级索引 idx_key1 中获取到对应的二级索引记录。
  • 根据上一步骤得到的二级索引记录中的主键值进行回表,找到完整的用户记录再检测该记录是否符合
  • key1 LIKE '%a' 这个条件,将符合条件的记录加入到最后的结果集。

但是虽然key1 LIKE '%a'不能组成范围区间参与 range 访问方法的执行,但这个条件毕竟只涉及到了key1 列,所以MySQL 把上边的步骤改进了一下:

  • 先根据 key1 = 'z' 这个条件,定位到二级索引 idx_key1 中对应的二级索引记录。
  • 对于指定的二级索引记录,先不着急回表,而是先检测一下该记录是否满足 key1 LIKE '%a' 这个条件,如果这个条件不满足,则该二级索引记录压根儿就没必要回表。
  • 对于满足 key1 LIKE '%a' 这个条件的二级索引记录执行回表操作。

我们知道,回表操作其实是一个随机 IO ,比较耗时,所以上述修改虽然只改进了一点点,但是可以省去好多回表操作的成本。

二、验证

如果在查询语句的执行过程中将要使用索引条件下推这个特性,在 Extra 列中将会显示 Using index condition

2.1 建表语句

#创建表 建立name, city, age三个字段的复合索引,sex是为了避免索引覆盖
CREATE TABLE user_index (id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',name varchar(32)  COMMENT '姓名',city varchar(32)  COMMENT '城市',age int(11)  COMMENT '年龄',sex int(1) default 0,primary key(id),key idx_name_city(name, city, age)
)engine=InnoDB default charset=utf8;#插入数据
insert into user_index(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);

2.2 关闭索引下推

关闭索引下推,查看执行计划:

#关闭索引下推
set optimizer_switch='index_condition_pushdown=off';
#查看执行计划
explain select * from user_index where name = 'ZhaoDa' and age = 20;
+--+-----------+----------+----------+----+-------------+-------------+-------+-----+----+--------+-----------+
|id|select_type|table     |partitions|type|possible_keys|key          |key_len|ref  |rows|filtered|Extra      |
+--+-----------+----------+----------+----+-------------+-------------+-------+-----+----+--------+-----------+
|1 |SIMPLE     |user_index|null      |ref |idx_name_city|idx_name_city|99     |const|1   |10      |Using where|
+--+-----------+----------+----------+----+-------------+-------------+-------+-----+----+--------+-----------+

2.3 打开索引下推

打开索引下推,默认是开启的,再次查看执行计划:

#打开索引下推  默认是开启
set optimizer_switch='index_condition_pushdown=on';
#查看执行计划
explain select * from user_index where name = 'ZhaoDa' and age = 20;
+--+-----------+----------+----------+----+-------------+-------------+-------+-----+----+--------+---------------------+
|id|select_type|table     |partitions|type|possible_keys|key          |key_len|ref  |rows|filtered|Extra                |
+--+-----------+----------+----------+----+-------------+-------------+-------+-----+----+--------+---------------------+
|1 |SIMPLE     |user_index|null      |ref |idx_name_city|idx_name_city|99     |const|1   |10      |Using index condition|
+--+-----------+----------+----------+----+-------------+-------------+-------+-----+----+--------+---------------------+

并且索引还是遵循最左匹配的。

三、总结

索引条件下推:简单来说就是把索引当中的所有数据全部用到减少回表的次数,达到优化的目的。

表现:查看执行计划时Extra会显示为Using index condition

http://www.lryc.cn/news/307480.html

相关文章:

  • 【Java程序设计】【C00338】基于Springboot的银行客户管理系统(有论文)
  • C语言中大小写字母的转化
  • Camunda7.18流程引擎启动出现Table ‘camunda_platform_docker.ACT_GE_PROPERTY‘的解决方案
  • 红队打靶:DR4G0N B4LL打靶思路详解(vulnhub)
  • SQL Server添加用户登录
  • pytest如何在类的方法之间共享变量?
  • 配置前端项目到 github-pages
  • VSCode使用教程
  • vscode——本地配置(C和C++环境配置)(2)
  • 【从零开始学习重要知识点 | 第一篇】快速了解什么是幂等性以及常见解决方案
  • Jvm之内存泄漏
  • 尚硅谷webpack5笔记2
  • 笔记本Win 10系统查看电池健康状况
  • 算法--动态规划(线性DP、区间DP)
  • 【ArcGIS】统计格网中不同土地利用类型占比
  • 算法竞赛实用板子
  • RPA中国 x UiPath | 第六届RPA极客挑战赛,3月16日上海开赛!
  • 算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和
  • 『python爬虫』xpath变化导致无法找到指定元素(持续更新中~)
  • 人大金仓数据库Kingbase服务SQL基础操作手册
  • 赎金信00
  • 如何运行github上的项目
  • 机器学习-02-机器学习算法分类以及在各行各业的应用
  • Java项目学习
  • npm run dev和npm run serve两个命令的区别
  • ui设计:利用即使设计设计出漂亮样式
  • [unity]lua热更新——个人复习笔记【侵删/有不足之处欢迎斧正】
  • Springboot日常总结-@RestController和@Controller的区别
  • MongoDB之客户端工具与核心概念及基本类型篇
  • Essential C++ 编程基础