开头
    在 MySQl5.6 版本中,带来了 index condition pushdown,简称ICP,也就是大名鼎鼎的索引下推。索引下推不像覆盖索引那么好理解,今天就带你秒懂索引下推
先来一个建表语句

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`),# 建立(name,age)联合索引KEY `index_name_age` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

来点数据

INSERT INTO `user` VALUES (1, '张三', 18);
INSERT INTO `user` VALUES (2, '张四', 20);

来一个查询语句

SELECT * FROM `user` WHERE name LIKE "张%" AND age=18;

这样是否用到了索引下推呢?

答案是,用到了(注意!!!这里示例的数据过少,实际不会走索引,这里不考虑数据量的问题)为什么这样算用到了索引下推呢?下面我们来分析一下。

分析:
1、根据最左匹配原则,name LIKE "张%"可以走索引,但是age=18无法走索引,因为由于name LIKE "张%"走了索引,导致age此时已经是非有序的了,剩下的索引就没办法走了,性价比太低了,这就导致了在联合索引这个二级索引中找到了两条数据(id=1,id=2),需要回表两次。要知道回表是非常损耗性能的。
2、索引下推推出以后,优化器就多了一个选择,就是让存储引擎逐个扫描两条数据(id=1,id=2),筛选出符合 age=18 的数据,这样最终只得到了一个数据,只需要回表一次。

总结
    总结下来就是,索引下推逐个扫描并筛选数据花费的时间<索引下推减少的回表次数从而节省的时间,即 后者时间-前者时间>0,那么就会使用索引下推来优化查询性能。
    要记住,MySQL查询语句的优化,就是基于成本的,谁便宜就选谁!(出自《MySQL是怎样运行的》)

参考

五分钟搞懂MySQL索引下推——作者三分恶

“秒懂”索引下推!原来索引下推这么简单!相关推荐

  1. Mysql:好好的索引,为什么要下推?

    作者|莱乌 前段时间有读者提议讲讲索引下推,这期就把这事儿安排上.多余的前言就不赘述了,我们直接开始. 列位坐好! - 思维导图 - 回表操作 对于数据库来说,只要涉及到索引,必然绕不过去回表操作.当 ...

  2. 覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推

    写在前面 在MySQL数据库中,索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率.今天我们来聊聊在MySQL索引优化中两种常见的方式,索引覆盖和 ...

  3. mysql索引下推原理_MySQL:好好的索引,为什么要下推?

    前段时间有读者提议讲讲索引下推,这期就把这事儿安排上.多余的前言就不赘述了,我们直接开始. 列位坐好! - 思维导图 - 回表操作 对于数据库来说,只要涉及到索引,必然绕不过去回表操作.当然这也是我们 ...

  4. 简单易懂的MySQL覆盖索引、前缀索引、索引下推

    文章目录 前言 常见的索引类型 聚簇索引/非聚簇索引 覆盖索引 前缀索引 索引下推 前言 索引的出现是为了提高数据查询效率,像书的目录一样.对于数据库的表而言,索引其实就是"目录" ...

  5. mysql索引创建规则、联合与一般索引、执行计划、索引选择,索引重建与下推

    数据库索引怎么建,什么时候用到 索引优缺点:为主键外建where子句建立索引可以加速数据库查询,但是索引占用内存,同时update和insert的时候需要同步修改;索引的实现通常使用其变种B+树. 建 ...

  6. mysql索引篇之覆盖索引、联合索引、索引下推

    覆盖索引 在之前<mysql索引初识>这篇文章中提到过,mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即 ...

  7. mysql索引条件下推_MySQL 索引条件下推优化

    一 什么是"索引条件下推" "索引条件下推",称为Index Condition Pushdown (ICP),这是MySQL提供的用某一个索引对一个特定的表从 ...

  8. mysql如何创建简单索引_mysql 如何创建索引呢,这个其实很简单

    mysql 如何创建索引? mysql 如何创建索引呢,这个其实很简单 create index或者为己有字段增加索引 ALTER TABLE `table_name` ADD UNIQUE (`co ...

  9. SQL Server 索引(index) 和 视图(view) 的简单介绍和操作

    2019独角兽企业重金招聘Python工程师标准>>> --索引(index)和视图(view)-- --索引(index)-- --概述: 数据库中的索引类似于书籍的目录,他以指针 ...

  10. elasticsearch 建立索引、增删改查 及简单查询和组合查询的学习笔记

    创建一个索引(数据库) PUT lagou # 索引名称 {"settings": {"index":{"number_of_shards" ...

最新文章

  1. 有监督、无监督与半监督学习【总结】
  2. 操作系统(三十七)基本分页存储的概念
  3. Linux写时拷贝技术(copy-on-write)
  4. Android之二维码扫描的总结
  5. 学C语言办公本和游戏本,为什么不建议买游戏本?入手前须知,别只看中游戏...
  6. java.lang.IllegalArgumentException: URLDecoder异常解决
  7. Underfull hbox (badness 10000) in paragraph at lines 83--86
  8. Windows操作系统的缘由
  9. 什么导致了android.os.NetworkOnMainThreadException异常
  10. PLC模糊控制之模糊化
  11. 通过Kettle工具解析Json接口数据并且保存到数据库中的详细操作
  12. word转pdf实现,POIXMLDocumentPart.getPackageRelationship()Lorg...问题,以及NotOfficeXmlFileException...问题
  13. matlab删掉txt文件中的数据,matlab中读取txt数据文件(txt文本文档)
  14. #读源码+论文# 三维点云分割Deep Learning Based Semantic Labelling of 3D Point Cloud in Visual SLAM
  15. python父亲节祝福_用python祝福父亲节_父亲节送给父亲的祝福语,挑一句话发朋友圈!...
  16. 图书馆座位预约系统管理/基于微信小程序的图书馆座位预约系统
  17. 【机械仿真】基于matlab打桩机运动学仿真【含Matlab源码 2101期】
  18. 苹果云服务器里的家人共享位置,iPhone“家人共享”服务是什么?
  19. python输出如何加单位_如何以十为单位写出数据输出
  20. 发邮件抛异常。no object DCH for MIME type text/plain; charset=UTF-8

热门文章

  1. 怎样防止表单重复提交
  2. 最最最详细的springboot项目中集成微信扫码登入功能.步骤代码超级详细(OAuth2)
  3. stm32+cc1101外部中断接收信息
  4. 下载支付宝秘钥生成工具
  5. linux键盘背光指令,在Linux下开启背光Led键盘的背光
  6. 摸鱼时间,画个吃豆人玩一下
  7. [Mysql] GROUP BY分组
  8. Xcode免证书打包ipa
  9. c语言void结尾,C语言中void*详解及应用
  10. 如何用小程序玩转裂变?你要的小程序裂变营销都在这里