【MySQL实战笔记】 05 | 深入浅出索引(下)-01

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 【4月更文挑战第14天】创建表T的SQL和其索引结构被展示,分析了查询`select * from T where k between 3 and 5`的执行流程,涉及两次回表操作。介绍覆盖索引的概念,指出当查询列包含在索引中时,可以避免回表,提高性能。在市民信息表`tuser`上,是否需要创建身份证号和名字的联合索引取决于查询需求,若高频查询涉及身份证号和姓名,该联合索引是有益的。

引言

思考一个问题,T的建表语句如下

create table T (
    ID int primary key,
    k int NOT NULL DEFAULT 0,
    s varchar(16) NOT NULL DEFAULT '',
    index k(k))
engine=InnoDB;

执行select * from T where k between 3 and 5需要执行几次树的搜索操作,会扫描多少行

2024-04-19-20-26-56-image.png

这条SQL的执行流程如下:

  1. 在K索引树上找到k=3的记录,取ID=300

  2. 在ID索引树上查到ID=300对应的R3

  3. 在k索引树取下一个值k=5,取得ID=500

  4. 在回到ID索引树查到ID=500对应的R4

  5. 在k索引树上取下一个值k=6,不满足条件,循环结束

回到主键索引树搜索得过程,称之为回表。这个查询过程读了k索引树的3条记录,回表了2次。

因为要查询的数据只有主键索引上有,所以不得不回表。那么有没有可能优化索引来避免回表呢?

覆盖索引

如果执行的语句是select ID from T where k between 3 and 5,这时候只需要查ID的值,而ID的值已经在k索引树上了,因此不需要回表。也就是说,索引k已经覆盖了查询需求,就称之为覆盖索引。

因为覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

注意:在引擎内部使用覆盖索引在索引k上其实读了三条记录,R3~R5,但是对于MySQL的Server层来说,它找引擎拿了两条记录,因此MySQL认为扫描行数是2

基于上述说明,再来讨论一个问题:在市民信息表上,是否有必要将身份证号和名字建立联合索引。

CREATE TABLE `tuser` (
    `id` int(11) NOT NULL,
    `id_card` varchar(32) DEFAULT NULL,
    `name` varchar(32) DEFAULT NULL,
    `age` int(11) DEFAULT NULL,
    `ismale` tinyint(1) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `id_card` (`id_card`),
    KEY `name_age` (`name`,`age`)
) ENGINE=InnoDB

一般来说,身份证号是市民的唯一标识,如果有根据身份证号查询市民信息的需求,只需要在身份证号上建立索引就够了。但是如果有高频的请求是根据市民的身份证号查询姓名,这个联合索引就比较有意义了。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
SQL 存储 关系型数据库
MySQL索引及事务
MySQL索引及事务
14 2
|
16小时前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】分库分表
分库分表是一种数据库架构设计的方法,用于解决大规模数据存储和处理的问题。 分库分表可以简单理解为原来一个表存储数据现在改为通过多个数据库及多个表去存储,这就相当于原来一台服务器提供服务现在改成多台服务器组成集群共同提供服务。
21 8
|
3天前
|
存储 SQL 关系型数据库
完蛋!😱 我被MySQL索引失效包围了!
完蛋!😱 我被MySQL索引失效包围了!
|
3天前
|
SQL 存储 关系型数据库
MySQL的3种索引合并优化⭐️or到底能不能用索引?
MySQL的3种索引合并优化⭐️or到底能不能用索引?
|
3天前
|
存储 SQL 关系型数据库
MySQL索引,看这一篇就够了!
MySQL索引,看这一篇就够了!
|
4天前
|
Java 关系型数据库 MySQL
MySQL 索引事务
MySQL 索引事务
12 0
|
4天前
|
存储 SQL 关系型数据库
MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
20 0
|
4天前
|
自然语言处理 关系型数据库 MySQL
一文明白MySQL索引的用法及好处
一文明白MySQL索引的用法及好处
14 0
|
5天前
|
存储 SQL 关系型数据库
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
以小白的视角探究MySQL索引条件下推ICP的优化,其中包括server层与存储引擎层如何交互、索引、回表、ICP等内容
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
|
7天前
|
存储 SQL 关系型数据库
MySQL万字超详细笔记❗❗❗
MySQL万字超详细笔记❗❗❗
48 1
MySQL万字超详细笔记❗❗❗

推荐镜像

更多