【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
目录
相关文章
|
5天前
|
存储 关系型数据库 MySQL
Mysql索引总结(1)
Mysql索引总结(1)
13 0
|
19天前
|
存储 关系型数据库 MySQL
【MySQL实战笔记】 04 | 深入浅出索引(上)-01
【4月更文挑战第8天】这篇文章除了介绍索引的作用和提高查询效率的原理,还探讨了三种常见的数据结构:哈希表、有序数组和搜索树。哈希表适合等值查询,但不支持范围查询;有序数组利用二分查找实现快速等值查询,但更新成本高;二叉搜索树保持平衡时查询高效,但磁盘存储时效率低。文章指出,由于磁盘读取延迟,实际数据库索引设计需考虑减少磁盘访问次数。
33 5
|
21天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
16 0
|
27天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
|
2月前
|
存储 自然语言处理 关系型数据库
ElasticSearch索引 和MySQL索引那个更高效实用那个更合适
ElasticSearch索引 和MySQL索引那个更高效实用那个更合适
38 0
|
2月前
|
SQL 存储 关系型数据库
MySQL not exists 真的不走索引么
MySQL not exists 真的不走索引么
25 0
|
2月前
|
SQL 存储 关系型数据库
对线面试官 - 如何理解MySQL的索引覆盖和索引下推
索引下推是MySQL 5.6引入的优化,允许部分WHERE条件在索引中处理,减少回表次数。例如,对于索引(zipcode, lastname, firstname),查询`WHERE zipcode='95054' AND lastname LIKE '%etrunia%'`时,索引下推先过滤zipcode,然后在索引中应用lastname条件,降低回表需求。索引下推可在EXPLAIN的`Using index condition`中看到。
对线面试官 - 如何理解MySQL的索引覆盖和索引下推
|
5天前
|
SQL 关系型数据库 MySQL
MySQL8.0索引新特性
MySQL8.0索引新特性
10 0
|
21天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
87 1
|
27天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)