我用索引下推把MySQL性能一下优化了100倍,你信吗?
「 关注“石杉的架构笔记”,大厂架构经验倾囊相授 」
文章来源:https://juejin.cn/post/7164973560660754469
前言
说到MySQL的优化手段,不得不提的是MYSQL5.6
中引入的一种新特性,索引下推,英文是 index condition pushdown
,一般简称为 ICP
。这也是MySQL面试中经常被问到的一个考点,本文就此分享下索引下推是怎么一回事,它是如何对提高查询效率起到帮助的。
理解索引下推
索引下推就是指在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数来提高查询效率。
如何理解呢?我们直接上栗子来解释:
新建用户表
CREATE TABLE user(`id` int NOT NULL AUTO_INCREMENT,`zipcode` varchar(20) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,`address` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`),index idx_zip_name(`zipcode`, `name`)
) ENGINE=INNODB;insert into user(zipcode, name, address)
values ('100001', '陈旭阳', '杭州'),('100001', '胡歌', '上海'),('200002', '杨幂', '北京'),('300002', '刘诗诗', '南京');
创建了基于邮编
zipcode
和名称name
的联合索引idx_zip_name
,用于查找某个邮编下,名字包含陈的人。
查询语句
select * from user where zipcode = '100001' and name like '%陈%' and address like '%余杭%';
查询条件根据
zipcode
精确查找,name
和address
全模糊匹配。
如果MySQL5.6以前, 没有索引下推特性,整个流程如下图:
联合索引中知道
100001
的数据项,因为name
是全模糊,无法走索引,address
压根没有索引,他们无法在联合索引中过滤,怎么办?只能回到数据最全的聚簇索引上进行name like '%陈%' and address like '%余杭%'
这个逻辑的过滤。按照上面的方式,每次回到聚簇索引这个一个称做 “回表” 的过程,势必增加磁盘IO,从而影响查询性能。
那么有什么办法可以优化呢?
优化的目标就是尽量减少回表这一过程,我们发现联合索引上竟然有了name字段的信息,为什么我们不能充分利用呢?name like '%陈%'
我们可以直接在索引树上进行判断name是不是包含陈,从而减少回表次数。这也正是MySQL5.6中优化的特性,如下图所示:
根据查询条件
name like '%陈%'
,陈旭阳
包含了陈, 那么它去回表过滤address内容。而其他记录比如
胡歌
等不包含陈,那么其他记录就无需回表,再次去匹配address地址是否符合了,相当于减少了回表。
上面图中的索引都用表格表示,只是为了方便,实际上索引底层数据结构是B+数据,如果不了解的,可以阅读文章:一步步带你设计MySQL索引数据结构
一句话总结:索引下推(index condition pushdown,ICP),有效的减少了回表次数,提高了查询效率。
索引下推性能比较
竟然索引下推可以提高效率,那我们验证下。
沿用上面的user表
创建存储过程,添加数据
DELIMITER //
CREATE PROCEDURE insert_user(max_num INT)
BEGIN
DECLARE i INT DEFAULT 0;SET autocommit = 0;REPEATSET i = i + 1;INSERT INTO user(zipcode,name,address) VALUES ('10018', '陈旭阳', '杭州');UNTIL i =max_num
END REPEAT;
COMMIT;
END //DELIMITER ;
调用存储过程
call insert_user(1000000);
打开性能检查工具
profiling
set profiling = 1;
启用索引下推方式查询
select * from user where zipcode = '10018' and name like '%李%';
禁用索引下推方式查询
select /*+ no_icp(user) */ * from user where zipcode = '10018' and name like '%李%';
查看当前会话下的profiles
show profiles;
结果如下:
有索引下推
0.21s
没有索引下推花了
2.6s
使用ICP性能提高还是比较明显的,特别是数据量大的情况下。
执行计划中的索引下推
如何判断你的SQL中是否使用了到索引下推的特性呢?
我们利用explain
查看SQL的执行计划时,如果发现Extra
字段中有Using index condition
,即表示使用到了索引下推。
注意如果发现一直没有用上索引下推,需要检查下功能是否被禁用,默认是打开的。
可以通过设置系统变量
optimizer_switch
控制:index_condition_pushdown
# 打开索引下推
SET optimizer_switch = 'index_condition_pushdown=on';# 关闭索引下推
SET optimizer_switch = 'index_condition_pushdown=off';
总结
本文介绍了索引下推特性,并简要分析了它的实现原理。虽然说,这个特性MySQL支持了,但是为什么我们还要学习理解它呢,因为它对于我们如何写SQL、如何创建索引还是起着指导作用的。如果本文对你有帮助的话,请留下一个赞吧。
欢迎扫码加入儒猿技术交流群,每天晚上20:00都有Java面试、Redis、MySQL、RocketMQ、SpringCloudAlibaba、Java架构等技术答疑分享,更能跟小伙伴们一起交流技术
另外推荐儒猿课堂的1元系列课程给您,欢迎加入一起学习~
互联网Java工程师面试突击课
(1元专享)
SpringCloudAlibaba零基础入门到项目实战
(1元专享)
亿级流量下的电商详情页系统实战项目
(1元专享)
Kafka消息中间件内核源码精讲
(1元专享)
12个实战案例带你玩转Java并发编程
(1元专享)
Elasticsearch零基础入门到精通
(1元专享)
基于Java手写分布式中间件系统实战
(1元专享)
基于ShardingSphere的分库分表实战课
(1元专享)
我用索引下推把MySQL性能一下优化了100倍,你信吗?相关推荐
- mysql性能结构优化原理_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...
一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...
- MySQL性能结构优化原理(技术核心)
一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 1.通过用户反馈获取存在性能问题的SQL: 2.通过慢查日志获取存在性能问题的SQL: 3.实时获取存在性能问题的SQL: 1.1. ...
- 技术核心 | MySQL性能结构优化原理
一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能问题的SQL: 通过慢查日志获取存在性能问题的SQL: 实时获取存在性能问题的SQL: 慢查日志分析工具 相 ...
- asp mysql 性能_asp优化:最大限度优化你的Asp性能
ASP 能快速执行你的动态网页,但你还可以通过紧缩代码和数据库连接以使它们执行更快.这是一篇关于怎样精简代码和Asp 特征以获得最快执行速度的详细文章.对于一个急燥的用户来说,任何在按下用户按钮到结果 ...
- mysql索引篇之覆盖索引、联合索引、索引下推
覆盖索引 在之前<mysql索引初识>这篇文章中提到过,mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即 ...
- 覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推
写在前面 在MySQL数据库中,索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率.今天我们来聊聊在MySQL索引优化中两种常见的方式,索引覆盖和 ...
- MySQL索引下推(5.6版本+)
索引下推(听着高大上,就是一层窗户纸而已) 有了索引下推优化,可以在有like条件查询的情况下,减少回表次数. 对于user_table表,我们现在有(username,age)联合索引 如果现在有一 ...
- Mysql中到底什么是索引下推,一分钟看懂
索引条件下推(Index Condition Pushdown),简称ICP.MySQL5.6新添加,用于优化数据的查询. 理论 索引下推简单来说就是把索引当中的所有数据全部用到减少回表的次数 假如现 ...
- 原理这就是索引下推呀
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 索引下推是之前面试的时候遇到的一个面试题,当时没有答上来,今天来学习一下. 介绍索引下推之前先看一下 ...
最新文章
- 最近做了一个小小的系统,收获挺大的....我想总结一下
- Windows server 2008 R2 通过策略关闭密码复杂性
- SAP LSMW 导入物料主数据报错 - You have not fully maintained the descriptions - 之分析
- 浅谈精品游戏的研发与发行-蓝港廖明香
- android 判断byte值_Android开发之UDP可靠性传输
- SQLite数据库的简单读写操作
- 检测python进程是否存活
- Android之TextUtils类介绍
- mysql抓包_mysql抓包工具
- 搭载鸿蒙的油烟机,华为、美的合作:搭载鸿蒙系统的家电来了 三大亮点
- win7 mysql添加到服务_MySQL服务添加到Windows系统服务中
- 求整数的和与均值(信息学奥赛一本通-T1061)
- 蚁群算法路径规划_环境感知与规划专题(十)——基于采样的路径规划算法(二)...
- php libev扩展使用
- PIC温控器c语言程序,PIC CCS C语言程序范例.doc
- Unity3D 代码优化
- WPF中直接打开网页方法总结
- css 缩小图片后,图片变模糊的解决办法
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
- 离散数学 群,环和域
热门文章
- JavaScript实现prime(普里姆)算法和kruskal(克鲁斯卡尔)算法
- 第二章 2.3 一阶逻辑等值式与前束范式
- 基于Flask制作一个简易版桌面监控软件
- 第二次世界大战与质量运动(2)(转载)
- 《算法导论》第四章-第4节_练习(参考答案)
- Excel VBA 利用FileSystemObject处理文件
- TXS0104EPWR芯片介绍(双向逻辑电平转换器,4通道,50 mA,4.6 ns,1.65 ~3.6V电平输入 至 2.3~5.5 V电平输出)
- 视觉SLAM十四讲 报错ch13 问题汇总 /usr/bin/ld: /usr/local/lib/libfmt.a(format.cc.o)
- View 是如何显示到屏幕上的
- 3分钟告诉你,我们是谁!