大家好,我是大彬~

今天给大家分享MySQL的索引下推。

什么是索引下推

索引条件下推,也叫索引下推,英文全称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表初始数据如下:

id name level weapon
1 大彬 1 键盘
2 盖聂 2 渊虹
3 卫庄 3 鲨齿
4 大铁锤 4 铁锤

假如需要匹配姓名第一个字为"大",并且level为1的用户,SQL语句如下:

SELECT * FROM user_info WHERE name LIKE "大%" AND level = 1;

那么这条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(id=1)回表查询全部数据,整个过程回表1次

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

总结

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

码字不易,如果觉得对你有帮助,可以点个赞鼓励一下!

最新文章

  1. Writing the first draft of your science paper — some dos and don’ts
  2. linux下最大文件数
  3. Codeforces Round #334 (Div. 2) A. Uncowed Forces 水题
  4. as3+java+mysql(mybatis) 数据自动工具(六)
  5. fopen,file_get_contents,curl的区别
  6. 搭建lamp环境Q&A
  7. 性能优化工具---vmstat
  8. javascript焦点图自动缓冲滚动
  9. .net 2.0 后台多线程
  10. Entity Framework入门教程:SQLite数据源访问
  11. iOS App签名的原理
  12. IDEA Can't Update No tracked branch configured for branch master or the branch doesn't exist.
  13. BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心
  14. 使用Junit进行单元测试
  15. APP端上传图片 - php接口
  16. face_recognition 基础接口
  17. 关于kvm虚拟机的克隆方法总结
  18. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
  19. apache&mod_wsgi&django部署多个项目
  20. 在J2EE中属于Web层的组件有(选择1项)

热门文章

  1. 流言粉碎机:JAVA使用 try catch 会严重影响性能
  2. 集合框架-TreeSet-Comparator比较器练习(字符串长度排序)
  3. Centos配置yum本地源最简单的办法
  4. linux主机名称文件修改
  5. JDBC 连接DRUID 连接池!
  6. glibc-2.18升级
  7. react 没有嵌套关系的组件通讯
  8. ABC182 F Valid payments
  9. 对于网络请求ajax理解
  10. NSMutableString常用方法