覆盖索引

假设要执行一条语句:

select * from T where k between 3 and 5;

初始对列k建立了索引,表中数据为:

那么其执行流程为:

  • 在k索引树上找到k=3的记录,取得ID=300;

  • 到ID索引树查到ID=300对应的记录。

  • 在k索引树上找到下一个值k=5的记录,取得ID=500;

  • 到ID索引树查到ID=500对应的记录。

  • 在k索引树上找到下一个值k=6,发现不满足条件。

这个过程中,发生了回表。假如建立的索引能“覆盖”我们的查询需求,就不需要回表,这种索引称为覆盖索引。比如在上面的查询语句中,若查询的是列k而不是*,就是一个覆盖索引。

需要注意的是,在引擎内部使用覆盖索引在索引k上其实能读到R3-R5三个记录,但是由于Server层只会从引擎得到两条记录,因此MySQL认为扫描行数为2。

最左前缀原则

B+树这种索引结构,可以利用索引的最左前缀,来定位记录。

比如建立了(name,age)的联合索引:

当要查询name="张三",可以快速定位到ID4,然后向后遍历。

当要查询where name like "张%",也能用上这个索引,定位到ID3,然后向后遍历。

因此,索引的最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。

索引下推

还是假设建立了(name,age)的联合索引,现在有一条SQL语句如下:

select * from tuser where name like '张%' and age=10 and ismale=1;

由最左前缀原则,这条语句能用上name的索引。

而其他条件的判断:

  • 在MySQL 5.6前,只能从找到的第一个记录ID3开始一个个回表,到主键索引上找出数据行,再对比后面两个字段。

  • MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤不满足条件的记录,减少回表次数。

两者的比较如下,第一张图是无索引下推,第二张图是有索引下推,箭头表示回表:

参考资料:极客时间专栏《MySQL实战45讲》https://time.geekbang.org/column/intro/100020801?tab=catalog

MySQL 05 深入浅出索引(下)的更多相关文章

  1. mysql在innodb索引下b+树的高度问题。

    B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...

  2. Mysql实战45讲 05讲深入浅出索引(下)极客时间 读书笔记

    极客时间 Mysql实战45讲 04讲深入浅出索引(下)极客时间 笔记体会: 回表:回到主键索引树搜索的过程,称为回表覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID fro ...

  3. MySQL 笔记整理(5) --深入浅出索引(下)

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 5) --深入浅出索引(下) 这次的笔记从一个简单的查询开始: 建表语句是这样的 mysql> create table T ...

  4. MySQL 笔记整理(4) --深入浅出索引(上)

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 4) --深入浅出索引(上) 一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样. 索引的常见模型 哈希表: ...

  5. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  6. Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间

    极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记  笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...

  7. mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护

    理想的索引,高效的索引建立考虑: :查询频繁度(哪几个字段经常查询就加上索引) :区分度要高 :索引长度要小 : 索引尽量能覆盖常用查询字段(如果把所有的列都加上索引,那么索引就会变得很大) : 索引 ...

  8. 深入理解MySQL索引(下)

    先创建一个T表. mysql> create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT ...

  9. java面试一日一题:讲下mysql中的索引

    问题:请讲下mysql中的索引 分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质? 回答要点: 主要从以下几点去考虑 1.索引的本质是什么 2.mysql的索引分类: 3 ...

  10. 【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解

    本文地址 分享提纲: 1. 概述 2. 详解配置文件 3. 详解日志 1.概述 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下:在Linux下叫my.cnf,该文件位于 ...

随机推荐

  1. 🎀FreeMarker 禁止自动转义标签-noautoesc

    简介 FreeMarker 是一个用 Java 语言编写的模板引擎,它被设计用来生成文本输出(HTML 网页.电子邮件.配置文件等).在 FreeMarker 中,默认情况下,当你在模板中输出变量时, ...

  2. python,循环中加入等待时间,使每一次循环后随机等待一段时间

    爬虫爬取网页数据的时候,有时候因访问频率太过于规律导致被服务器发现,出现访问超时或者被封ip的情况.所以,每一轮爬取,后面加一个随时等待时间,可以减少被发现的概率 主要用到random和time库 实 ...

  3. kettle介绍-Step之Value Mapper

    Value Mapper值映射介绍 值映射步骤是将字符串值从一个值映射为另一个值.值映射步骤提供了一个简单的替代方法,在输入流中选中一个字段,通过字段值设置源值和目标值,再将映射值输出给后续步骤使用. ...

  4. ElasticSearch学习——帮助类

    ElasticSearch第五步-.net平台下c#操作ElasticSearch详解 - 梦亦晓 - 博客园 (cnblogs.com) C# 如何使用 Elasticsearch (ES) - 领 ...

  5. 高度混淆和多层嵌套的JSP案例免杀思路

    免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任. 01 分析特征 目前webshell检测 ...

  6. 25.9K star!AI一键生成高清短视频,这个开源神器让内容创作起飞!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "MoneyPrinterTurbo 是基于AI大模型的全自动短视频生成工具,只需 ...

  7. MCP-Playwright:AI自动化神器,一款超级好用的自动化测试框架!

    在软件开发与测试领域,自动化测试早已成为提升效率.保障质量的核心工具.然而,传统自动化测试框架往往面临代码编写繁琐.跨工具协作困难.操作复杂等痛点. 而今天,给大家介绍一款自动化测试工具:MCP-Pl ...

  8. 代码随想录第十七天 | Leecode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树

    Leecode 654. 最大二叉树 题目描述 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在 ...

  9. Web前端入门第 46 问:CSS 中的数学函数不要只会 calc

    数学函数可以用来做什么? 最基础的当然是用来进行四则运算了,再进一步可以用来平方,对数,幂,绝对值,取余等,当然还可以用来计算三角函数. CSS 中的数学函数 灵活运用 CSS 中的数学函数,可以抛弃 ...

  10. 一站式搭建交友平台-交友系统源码-支持H5小程序+带安装说明+可封装APP-交友网站系统平台搭建

    诺诺婚恋交友系统 1.系统基于TP6+Uni-app框架开发:客户移动端采用uni-app开发,管理后台TH6开发. 2.系统支持微信公众号端.微信小程序端.H5端.PC端多端账号同步,可快速打包生成 ...