Mysql:好好的索引,为什么要下推?
作者|莱乌
前段时间有读者提议讲讲索引下推,这期就把这事儿安排上。多余的前言就不赘述了,我们直接开始。
列位坐好!
- 思维导图 -
回表操作
对于数据库来说,只要涉及到索引,必然绕不过去回表操作。当然这也是我们今天所讲内容的前调基础。
说到回表,我们需要从索引开始说起。别担心,不会长篇大论,这里只是简单讲下主键索引与普通索引,目的是让大家对回表操作有个认识。如果你对回表操作很熟悉了,那么可以跳过这一段。
这里我们只以 Innodb 存储引擎作为讲解对象。
主键索引
主键索引在底层的数据存储是通过 B+ 树来实现的。简单来说,就是除叶子节之外的其他节点都存储的是主键值。而叶子节点上存储的是整行的数据。
大体结构如下图所示。
非主键索引
除了主键索引外,其它的索引都被称为非主键索引。与主键索引不同的是,非主键索引的叶子节点上存储的是主键的值。
那让我们再回到开始的问题,什么是回表操作?
当我们在非主键索引上查找一行数据的时候,此时的查找方式是先搜索非主键索引树,拿到对应的主键值,再到主键索引树上查找对应的行数据。
这种操作就叫作回表操作。
好了,这里你应该了解了什么是回表操作了。简单来讲,就是在非主键索引树上拿到对应的主键值,然后回到主键索引上找到对应的行数据。
这样做的前提条件是,所要查找的字段不存在于非主键索引树上。
低版本操作
讲完了回表操作,让我们继续回到这篇文章的主题——索引下推。
其实在 Mysql 5.6 版本之前是没有索引下推这个功能的,从 5.6 版本后才加上了这个优化项。所以在引出索引下推前还是先回顾下没有这个功能时是怎样一种处理方式。
我们以一个真实例子来进行讲解。
在这里有张用户表 user,记录着用户的姓名,性别,身高,年龄等信息。表中 id 是自增主键,(name,sex) 是联合索引。在这里用 1 表示男,2 表示女。现在需要查找所有姓王的男性信息。
SQL 实现起来很简单:
但是它的实现原理是什么呢?
根据联合索引最左前缀原则,我们在非主键索引树上找到第一个满足条件的值时,通过叶子节点记录的主键值再回到主键索引树上查找到对应的行数据,再对比是否为当前所要查找的性别。
整个原理可以用下边的图进行表示。
看到了吧,低版本中需要每条数据都进行回表,增加了树的搜索次数。如果遇到所要查找的数据量很大的话,性能必然有所缺失。
高版本操作
讲完了低版本操作,让我们继续回到这篇文章的主题——索引下推。
知道了痛点,那么怎么解决。很简单,只有符合条件了再进行回表。结合我们的例子来说就是当满足了性别 sex = 1 了,再回表查找。这样原本可能需要进行回表查找 4 次,现在可能只需要 2 次就可以了。
所以本质来说,索引下推就是只有符合条件再进行回表,对索引中包含的字段先进行判断,不符合条件的跳过。减少了不必要的回表操作。
总结
回表操作
当所要查找的字段不在非主键索引树上时,需要通过叶子节点的主键值去主键索引上获取对应的行数据,这个过程称为回表操作。
索引下推
索引下推主要是减少了不必要的回表操作。对于查找出来的数据,先过滤掉不符合条件的,其余的再去主键索引树上查找。
推荐阅读
误执行了rm -fr /*之后,除了跑路还能怎么办?!程序员必备58个网站汇总大幅提高生产力:你需要了解的十大Jupyter Lab插件
Mysql:好好的索引,为什么要下推?相关推荐
- MySQL中的索引详讲
转载自 https://www.cnblogs.com/whgk/p/6179612.html 序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下 ...
- 大文本存mysql怎么建索引_如何正确合理的建立MYSQL数据库索引
# 有这样一个表 P mysql> create table P (id int primary key, name varchar(10) not null, sex varchar(1), ...
- mysql如何建立索引workbench_MySQL数据库中如何正确的理解与使用索引?
索引是存储引擎用于快速查找记录的一种数据结构,我们可以通过合理的使用数据库索引以提高数据库的访问效率.接下来主要介绍在MySQL 数据库中索引类型,以及如何创建出更加合理且高效的索引技巧. MySQL ...
- MySQL建立的索引看_MYSQL索引问题:索引在查询中如何使用?看了很多资料都只说索引的建立。是否建立了就不用再理会?...
# 有这样一个表 P mysql> create table P (id int primary key, name varchar(10) not null, sex varchar(1), ...
- BTREE这种Mysql默认的索引方式,具有普遍的适用性
文章转自 https://blog.csdn.net/caomiao2006/article/details/52145477 Mysql目前主要有以下几种索引方式:FULLTEXT,HASH,BTR ...
- mysql之优化-索引
一.优化思路 a.表的设计合理化(符合3NF) b.添加适当索引(index[4种:普通索引 主键索引 唯一索引unique 全文索引]) c.分表技术(水平分割,垂直分割) d.读写[写:updat ...
- mysql几种索引类型_Mysql几种索引类型的区别及适用情况
如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE. 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyI ...
- Mysql详解——索引优化
本篇文章是对Mysql索引的创建以及优化进行一个介绍,关于索引的底层原理可以看我另一篇文章:Mysql详解--索引详解 文章目录 一.索引的创建和设计原则 1. 索引的声明和使用 1.1 索引的分类: ...
- 高性能Mysql——创建高性能索引详解
索引(在MySQL中也叫做"键(key)")是存储引擎用于快速找到记录的一种数据结构.这是索引的基本功能,除此之外,本章还将讨论索引其他一些方面有用的属性. 索引对于良好的性能非常 ...
- mysql行锁索引问题_Mysql锁机制--索引失效导致行锁变表锁
=============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不会产生相互影响.不会阻塞, ...
最新文章
- 全国首套中小学生人工智能教材在沪亮相
- 皮一皮:下班的渴望...
- 在ASP.NET中创建自定义控件初步(转)
- sklearn特征的提取(下)
- html5_0_文章_分级_分段
- 【Java线程】Thread Runnable必知必会
- memcache如何更新mysql_使用MySQL触发器如何实现memcache自动更新
- Mysql连接错误:Mysql Host is blocked because of many connection errors
- Flutter使用ScreenUtil获取屏幕宽高初始化报错
- 笔记本电脑不要锁定计算机,笔记本电脑键盘怎么解锁呢
- postgresql 数据库迁移
- 《沃顿商学院谈判课》读书笔记
- LDD3 sleepy 模块
- HTML5中利用JavaScript实现拖放(来回)的案例
- 清除composite里的子控件
- Nacos 1.1.0发布,支持灰度配置和地址服务器模式
- PIN、PAN、PIN block说明
- Group BOM 和BOM group
- HDU-2549 壮志难酬
- 电力系统【第八章:电力系统不对称故障的分析与计算】
热门文章
- 微服务中远程调用Dubbo与Feign对比
- 一图看懂py2/py3编码
- 反思深度思考:预热[准备] 高密度[压力专注] 辨真伪[冷静分析] 反推[灵活] 结构化[全局]
- CSS中提升优先级属性!important的用法总结
- postman可以测试websocket吗_小海塔罗娱乐测试2021年可以脱单吗?
- android p版本 字符串常量池,Android OOM 问题
- cmd命令将web项目打成jar包_2020全网首发!JDK14之jpackage命令尝鲜
- java 访问线程_java线程简介(共享对数据的访问)
- matlab产生ofdm信号,Matlab 完成简单的OFDM 信号的产生与解调程序.pdf
- linux ssh rpm包,RHEL6(CentOS6)中使用源码包编译生成RPM的基本方法:升级OpenSSH篇