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

写在前面

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

索引覆盖

要了解索引覆盖,需要先了解几个索引的基础知识

B+树索引

B+树索引是InnoDB中的一种很常见的索引类型。关于B+树,这里不做深入的介绍,不太清楚的小胖友可以看单独介绍B树、B+树的文章。简单来说,是因为使用B+树存储数据可以让一个查询尽量少的读磁盘,从而减少查询时磁盘I/O的时间。在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。举例说明,假设我们有一张表,该表主键为id,且有用户名(user_name)和用户年龄(age)两个字段,其中age字段上有索引,所以建表语句如下图所示:

3c499bd8729aec12b218bbb01d7e040c.png

表中有5条数据

888deb4e87cdcd76fd971fb68a47046b.png

基于上面这种表设计和表中的数据,在InnoDB中的索引结构是下面这个样子的

eae38cd146d62429aae0355df3be16df.png

根据叶子节点的内容,索引的类型分为主键索引非主键索引
  • 主键索引的叶子结点存的是整条记录,如上图紫色部分所示

  • 非主键索引的叶子结点存的是主键的地址值,根据二级索引叶子结点中的地址可以找到主键索引中的这一条数据。所以非主键索引也被称为二级索引,如上图右半边黄色部分所示

那主键索引、二级索引的概念和我们今天介绍的内容有什么关系呢?我们下面来具体说说回表根据刚才提供的表结构,我们尝试来做两次次这样的查询:
select *from lyb_test where id = 2select *from lyb_test where age = 12
  • 第一条语句使用主键作为检索条件,即为主键查询,根据上图所示我们知道,如果是主键查询,我们只需要搜索左边这颗主键索引树即可快速查询到id=2的这条数据

  • 第二条语句使用的是二级索引、即age作为检索条件,这和主键查询有什么区别呢?如果是二级索引查询,则需要先搜索左侧的age索引树,得到id的值为2,再到右侧的主键索引树搜索一次。

像第二种查询语句这样,通过非主键索引查询数据时,我们先通过非主键索引树查找到主键值,然后再在主键索引树搜索一次(根据rowid再次到数据块里取数据的操作),这个过程称为回表,也就是说非主键索引查询会比主键查询多搜索一棵树

索引覆盖

结合上面的知识储备,我们进一步来优化一下刚才的SQL

select *from lyb_test where age = 12
当这条语句执行时,我们知道会进行两次索引树查询,第一次在二级索引上查询到主键索引的引用,然后到主键索引树中查询到所需要的数据,这个过程我们称之为回表。那为什么要有回表操作呢?由于查询的结果是所有字段,所需要的数据只有主键上才有,所以不得不回表。我们如果将sql改造为下面这种方式:
select id from lyb_test where age = 12

由于查询的值是ID,而id的值已经在age索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,当SQL语句的所有查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中,便可以直接使用索引查询而不需要回表。即在这个查询里,索引age已经“覆盖了”我们的查询需求,故称为索引覆盖。

索引下推

还是基于刚才的表结构和数据,我们现在针对user_name和age建立联合索引,索引建立之后,查询姓名以b开头且年龄大于等于13的用户信息,SQL语句如下:

select * from user_table where username like 'b%' and age >= 13
语句的执行过程有两种可能性:
  1. 根据(username,age)联合索引查询所有满足名称以"b"开头的索引,然后回表查询出相应的全行数据,再筛选出满足年龄大于等于13的用户数据。如果表中user_name以b开头的数据有n条,则需要回表n次

  2. 根据(username,age)联合索引查询所有满足名称以"b"开头的索引,然后直接再筛选出年龄大于等于13的索引,之后再回表查询全行数据。经过两次筛选之后,回表次数一定小于上述第一种情况

我们把第二种语句执行的过程称之为索引下推在MySQL中,索引下推是默认启用的状态。在使用InnoDB存储引擎的数据表中,索引下推只能用于二级索引。我们可以通过修改MySQL系统变量来控制索引下推是否开启。设置如下:
SET optimizer_switch = 'index_condition_pushdown=off';// 关闭SET optimizer_switch = 'index_condition_pushdown=on';// 开启

索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段,查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引。假设表t有联合索引(a,b),下面语句可以使用索引下推提高效率

select * from t where a > 2 and b > 10

上述就是索引覆盖、回表、索引下推的相关概念和使用场景。当然针对MySQL的索引优化还有其他非常多的方式,我们可以在之后的文章中讨论。本文到这里就结束啦,谢谢小伙伴们的阅读~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循环斐波那契数列_第五课:斐波那契数列(第一课时)

简介:又称黄金分割数列、因数学家列昂纳多斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34……在数学上,斐波那契数列以如下被以递推的方法定义:F(…

命令行 蓝牙_Ubuntu使用BlueZ驱动蓝牙dongle

蓝牙dongle即蓝牙适配器,一般为USB接口,通过USB连接到PC等设备。连接dongle后,PC即可使用驱动程序控制dongle连接其它蓝牙设备。本文主要介绍在Ubuntu系统中安装BlueZ的方法及蓝牙的使用。01获取BlueZBlueZ是Linux系统的官方蓝牙协议栈&#…

Java在Windows下导出xml文件到Linux服务器上

最近由于公司项目需要,学习了在Windows平台导出xml文件到Linux服务器上的指定目录下的方法,(注:这里的我的Linux是在本机上装的虚拟机)现在写下来记录一下! 1.首先是项目截图: 2.主要是类&…

java peek函数_Java 8 Stream Api 中的 peek 操作

1. 前言我在 Java 8 Stream API中的 map 和flatMap 中讲述了Java8 Stream API中 map 操作和 flatMap 操作的区别。然后有小伙伴告诉我 peek 操作 也能实现元素的处理。但是你知道 map 和 peek 的区别吗? map 我们在开头文章已经讲过了,你可以去详细了解一…

iphone如何查看dns延迟_iPhone手机网速慢?1分钟教你设置DNS,网速立马翻一番

很多小伙伴在购机时选择苹果手机都是因为iOS系统的流畅度和精简性,但iPhone在可玩性和信号方面是不如安卓手机的。大家在使用过程中一定遇到过这样的情况,连接同一个无线网,但是苹果的网速总是要比安卓慢,这该怎么办呢&#xff1f…

copying mysql status_mysql慢查询copying to tmp table

windows server,无论修改my.ini的tmp_table_size,max_heap_table_size到多少,情况都一样。同样的表和查询语句,在本地运行,没出现慢查询。SELECTg.goods_id,g.goods_name,g.shop_price,g.goods_thumb,SUM(og.goods_num…

JDK 7,jdk1.7 安装及配置

1.打开网页:http://www.oracle.com 下载对应平台的合适JDK。 2. 双击下载的exe,如jdk-7u7-windows-i586.exe。 3.进入安装向导: 4.下一步,更改安装路径,选择安装所有组件。 更改为D:\jdk1.7.0_07\ 点击确定 5.下一步,…

c mysql 编译_MySQL编译安装之cmake

mysql版本5.5以上编译安装时需要用到软件cmake,cmake特性是独立于源码编译,编译工作可以在另外一个目录中而非源码目录中进行,mysql版本5.5以上编译安装时需要用到软件cmake,cmake特性是独立于源码编译,编译工作可以在…

vb连接mysql未发现_vb连接MySQL遇到的问题解决方法

1.安装mysql,2.安装MyODBC-standard-3.51.07-win.msi3:vb连接语句是:Public strcnn As StringPublic sql As StringPublic conn A1.安装mysql,2.安装MyODBC-standard-3.51.07-win.msi3:vb连接语句是:Public strcnn As StringPublic sql As StringPublic conn As New ADODB.Conn…

mysql里面有没有map类型_MySQL学习(二) 数据类型

MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。数值类型数值类型又分为整数型与小数型整数型下面的表显示了需要的每个整数类型的存储和范围创建一张表mysql> CREATE TABLE t_int (int_1 TINYINT,int_2 SMALLINT,int_3 MEDIUMINT,int_4 INT,i…

shell执行perl_【编程技巧(一)】在Perl、Shell和Python中传参与输出帮助文档

社会你明哥,人狠话又多!【小明的碎碎念】与你不见不散!作为一名搞数据的生物狗,咱们是生物狗中代码写得最六的,程序员中生物学得最好的——大家没意见吧,有意见请憋着跟随小明的步伐,让我们开开…

python之路2.0_Python之路【第二十一篇】:JS基础

1.2 ECMAScript尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:● 核心(ECMAScript)● 文档对象…

solr4 mysql自动更新_(solr系列:五) solr定时实时重建索引和增量更新

将mysql中的数据导入到了solr中之后,如果数据库中的数据有变动,solr中还是第一次导入的旧的数据,那该如何是好呢?该如何实现mysql数据库中的数据定时同步到solr中呢?下面将做详细的介绍。准备工作要做好:1、…

mysql pydev_pydev-python 链接mysql数据库(mac系统)

在mac os上安装MySQLdb,遇到了非常多问题,总结一下:首先。假设用sudo easy_install mysql-python命令安装,基本上不会成功的,原因有两个:一是找不到mysql_config位置,二是如今基本上安装的是64位…

上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析...

一、选择题: 将唯一正确的选项写在题前括号中.每题2分.【】(1) 本课程的目标定位是什么?[A] 学习Python语言[B] 学习计算机的工作原理[C] 学习各种算法[D] 学习用计算机解决问题【】(2) 下列哪个标识符是合法的?[A] var-name [B] !#$% [C] _100 [D] elif【】(3) 执行下列语句…

mysql 安装测试ok_tpcc-mysql安装测试与使用的实例教程

1:下载tpcc-mysql的压缩包,从下面的网站进行下载也可直接从叶总博客直接下载:我这边使用的就是后者。2:安装tpcc-mysql[rootmxqmongodb2 tpccmysql]# gunzip tpcc-mysql-src.tgz[rootmxqmongodb2 tpccmysql]# tar xf tpcc-mysql-s…

python多线程写同一文件_Python多线程写文件实例

# -*- coding: utf-8 -*-import threading多线程生成日志工具__author ["yangfei" ]#该方法主要用于写入300行WARN日志def writeWarnLog(file):count0;while count<300:try:file.write(2012-11-28 22:51:01|zookeeper|WARN|m1|172.17.1.15\n)count1except Except…

java asc码_Java中ASC码与字符互相转化

package com.ljq.test;/*** Java中ASC码与字符互相转化** author jiqinlin**/public class ASCTest {private static int ascNum;private static char strChar;public static void main(String[] args) {System.out.println(getAsc("a"));System.out.println(backcha…

hp 导出日志 远程管理卡_惠普服务器远程管理卡安装详解

可以远程管理服务器。带惠普基于Web的网络资源管理和性能监视工具HP Toptools惠普远程管理卡的主要功能是可以实现对服务器的远程监控&#xff0c;其中包括察看日志、远程诊断、远程开/关机、重启等等。基于惠普远程管理卡的重要功能&#xff0c;本文将着重介绍惠普远程管理卡的…

java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟

本方法因为是根据思路纯手写&#xff0c;代码可以再简化&#xff0c;功能尝试没问题&#xff0c;最主要就是在登陆验证中的逻辑&#xff0c;checkLogin()方法是登录前的验证&#xff0c;而真正的登陆方式采用的是Shiro&#xff0c;若不是采用Shiro登陆&#xff0c;将该逻辑采用…