MySQL 05 深入浅出索引(下)
覆盖索引
假设要执行一条语句:
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 深入浅出索引(下)的更多相关文章
- mysql在innodb索引下b+树的高度问题。
		
B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...
 - Mysql实战45讲 05讲深入浅出索引(下)极客时间 读书笔记
		
极客时间 Mysql实战45讲 04讲深入浅出索引(下)极客时间 笔记体会: 回表:回到主键索引树搜索的过程,称为回表覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID fro ...
 - MySQL 笔记整理(5) --深入浅出索引(下)
		
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 5) --深入浅出索引(下) 这次的笔记从一个简单的查询开始: 建表语句是这样的 mysql> create table T ...
 - MySQL 笔记整理(4) --深入浅出索引(上)
		
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 4) --深入浅出索引(上) 一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样. 索引的常见模型 哈希表: ...
 - 数据库表设计时一对一关系存在的必要性    数据库一对一、一对多、多对多设计  面试逻辑题3.31  sql server 查询某个表被哪些存储过程调用  DataTable根据字段去重  .Net Core Cors中间件解析  分析MySQL中哪些情况下数据库索引会失效
		
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
 - Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间
		
极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记 笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...
 - mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护
		
理想的索引,高效的索引建立考虑: :查询频繁度(哪几个字段经常查询就加上索引) :区分度要高 :索引长度要小 : 索引尽量能覆盖常用查询字段(如果把所有的列都加上索引,那么索引就会变得很大) : 索引 ...
 - 深入理解MySQL索引(下)
		
先创建一个T表. mysql> create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT ...
 - java面试一日一题:讲下mysql中的索引
		
问题:请讲下mysql中的索引 分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质? 回答要点: 主要从以下几点去考虑 1.索引的本质是什么 2.mysql的索引分类: 3 ...
 - 【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解
		
本文地址 分享提纲: 1. 概述 2. 详解配置文件 3. 详解日志 1.概述 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下:在Linux下叫my.cnf,该文件位于 ...
 
随机推荐
- 🎀FreeMarker 禁止自动转义标签-noautoesc
			
简介 FreeMarker 是一个用 Java 语言编写的模板引擎,它被设计用来生成文本输出(HTML 网页.电子邮件.配置文件等).在 FreeMarker 中,默认情况下,当你在模板中输出变量时, ...
 - python,循环中加入等待时间,使每一次循环后随机等待一段时间
			
爬虫爬取网页数据的时候,有时候因访问频率太过于规律导致被服务器发现,出现访问超时或者被封ip的情况.所以,每一轮爬取,后面加一个随时等待时间,可以减少被发现的概率 主要用到random和time库 实 ...
 - kettle介绍-Step之Value Mapper
			
Value Mapper值映射介绍 值映射步骤是将字符串值从一个值映射为另一个值.值映射步骤提供了一个简单的替代方法,在输入流中选中一个字段,通过字段值设置源值和目标值,再将映射值输出给后续步骤使用. ...
 - ElasticSearch学习——帮助类
			
ElasticSearch第五步-.net平台下c#操作ElasticSearch详解 - 梦亦晓 - 博客园 (cnblogs.com) C# 如何使用 Elasticsearch (ES) - 领 ...
 - 高度混淆和多层嵌套的JSP案例免杀思路
			
免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任. 01 分析特征 目前webshell检测 ...
 - 25.9K star!AI一键生成高清短视频,这个开源神器让内容创作起飞!
			
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "MoneyPrinterTurbo 是基于AI大模型的全自动短视频生成工具,只需 ...
 - MCP-Playwright:AI自动化神器,一款超级好用的自动化测试框架!
			
在软件开发与测试领域,自动化测试早已成为提升效率.保障质量的核心工具.然而,传统自动化测试框架往往面临代码编写繁琐.跨工具协作困难.操作复杂等痛点. 而今天,给大家介绍一款自动化测试工具:MCP-Pl ...
 - 代码随想录第十七天 | Leecode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
			
Leecode 654. 最大二叉树 题目描述 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在 ...
 - Web前端入门第 46 问:CSS 中的数学函数不要只会 calc
			
数学函数可以用来做什么? 最基础的当然是用来进行四则运算了,再进一步可以用来平方,对数,幂,绝对值,取余等,当然还可以用来计算三角函数. CSS 中的数学函数 灵活运用 CSS 中的数学函数,可以抛弃 ...
 - 一站式搭建交友平台-交友系统源码-支持H5小程序+带安装说明+可封装APP-交友网站系统平台搭建
			
诺诺婚恋交友系统 1.系统基于TP6+Uni-app框架开发:客户移动端采用uni-app开发,管理后台TH6开发. 2.系统支持微信公众号端.微信小程序端.H5端.PC端多端账号同步,可快速打包生成 ...