MySQL索引面试题分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: MySQL索引面试题分析

MySQL索引面试题分析


话不多说,先建立一个表testTable,其中id为自增主键


20200216213712809.png

在c1,c2,c3,c4上建立符合索引索引


CREATE INDEX idx_testTable_c1234 ON testTable(c1,c2,c3,c4);


现在的题目是:根据以下SQL分析索引使用的情况

1.SELECT * FROM testTable WHERE c1='a1' AND c2='a2' AND c3='a3' AND c4='a4';
2.SELECT * FROM testTable WHERE c4='a4' AND c3='a3' AND c2='a2' AND c1='a1';

首先我们用explain语句来分析一下1,2条SQL语句


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2' AND c3='a3' AND c4='a4';


20200216214642807.png


EXPLAIN SELECT * FROM testTable WHERE c4='a4' AND c3='a3' AND c2='a2' AND c1='a1';

20200216214722852.png


在这里我们看到它们的结果都是一样的,这是为什么呢?

其实,在MySQL逻辑架构中,在MySQL执行SQL语句之前,会经过一个查询优化器,会把where语句后条件的顺序调整为最佳顺序来进行查询。


下面看看一下SQL语句


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2' AND c3>'a3' AND c4='a4';


20200216215151350.png


c3及以后的索引全失效,因此只用到了两个索引,c3、c4要进行排序查找


再看下面的SQL语句


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2' AND c4>'a4' AND c3='a3';

20200216215443908.png

从key_len=124可知,用到了四个索引。


再看下面的SQL语句


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2' AND c4='a4' ORDER BY c3;

20200216215739510.png

c3用于排序。


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2'  ORDER BY c3;

2020021621592552.png

结果与上面的SQL一样,但是c3作用是排序而不是查找。


再看看下面的SQL语句


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2'  ORDER BY c4;

20200217092734142.png

用到了c1,c2索引,但是c4是用于排序,中间的c3索引断了,MySQL会使用文件内排序给出查询结果,这样子就导致了性能下降。


再来看看:


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c5='a5'  ORDER BY c2,c3;


20200217093301211.png

只用到了c1索引,c2、c3用于排序


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c5='a5'  ORDER BY c3,c2;


c2,c3排序的顺序倒过来了,MySQL需要用文件内排序才能查询出结果


20200217093501617.png


导致了性能的下降。


再看看:


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2'  ORDER BY c2,c3;


20200217093814303.png

还很ok


再看:


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2' AND c5='a5' ORDER BY c2,c3;


20200217094011542.png


没有什么问题


以上两条SQL都是用到了c1,c2索引,但是c2、c3是用于排序,没有出现filesort,性能可以。


但是,再看,如果将c2、c3的顺序倒置:

EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c2='a2' AND c5='a5' ORDER BY c3,c2;

20200217094416193.png

竟然没有出现filesort,这是为什么呢?因为c2=‘a2’,order by中的c2字段已经是一个常量了,所以真正排序的字段就只有c3.


再看看下一个


EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c4='a4' GROUP BY c2,c3;


20200217095100742.png

EXPLAIN SELECT * FROM testTable WHERE c1='a1' AND c4='a4' GROUP BY c3,c2;

20200217095126466.png


用到了文件内排序。记住一句话,group by表面上是分组,但实际上分组的前提必须排序,且会有临时表排序。


那么分析了这么多索引失效的题目,我们应该如何建立好索引,写出性能较好的SQL语句呢?

20200217095657194.png

好了,索引的部分暂时告一段落,如果将来有遇到问题我会继续更新~

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
22天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
57 3
|
3月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
114 4
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
22天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
83 6
|
22天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
79 1
|
2月前
|
存储 关系型数据库 MySQL
深入理解MySQL索引类型及其应用场景分析。
通过以上介绍可以看出各类MySQL指标各自拥有明显利弊与最佳实践情墁,在实际业务处理过程中选择正确型号极其重要以确保系统运作流畅而稳健。
131 12
|
3月前
|
关系型数据库 MySQL Java
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
|
3月前
|
存储 SQL 关系型数据库
MySQL的Redo Log与Binlog机制对照分析
通过合理的配置和细致的管理,这两种日志机制相互配合,能够有效地提升MySQL数据库的可靠性和稳定性。
127 10
|
3月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则

推荐镜像

更多