索引面试题分析|学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 快速学习索引面试题分析

开发者学堂课程【MySQL 高级应用 - 索引和锁索引面试题分析】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/598/detail/8622


索引面试题分析


目录:

一、表的构建代码

二、索引构建

三、问题反馈

四、MySQL 逻辑构架


一、表的构建

1.创建表

create table test03(

id int primary key not null auto increment

c1 char(10),

c2 char(10),

c3 char(10),

c4 char(10),

c5 char(10)

);

2. 插入数据

insert into test03(c1c2c3c4c5)values(a1'a2'a3'a4'a5');

insert into test03(c1c2c3c4c5)values(b1b2'b3b4''b5);

insert into test03(c1c2c3c4c5)values(c1c2c3c4''c5');

insert into test03(c1c2c3c4c5)values(d1'd2''d3'd4'd5')

insert into test03(c1c2c3c4c5)values(e1'e2 e3e4'.55)

3.查询表

select*from test03;

 

二、构建索引

复合索引

create index idx test03_c1234 on test03(c1,c2,c3,c4); show index from test03;

排序+查找是索引两个用途

复合索引命名规则:表名_字段名

1.需要加索引的字段,要在 where 条件中。

2.数据量少的字段不需要加索引。最窄的字段放在键的左边。

3.如果 where 条件中是 OR 关系,必须所有的 or 条件都必须是独立索引,否则加索引不起作用。见:mysql 关于 or 的索引问题

4.最左匹配原则。

5.只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL 值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为 NULL

 

三、问题反馈

问题一:

我们创建了复合索引 idxtest03c1234 根据以下 SQL 分析下索引使用情况?

//权值匹配

explain select*from test03 wherec1=a1:

explain select* from test03 where c1='a1'and c2=a2:

explain select*from test03 where c1=a1'and c2=a2and c3=a3",

explainselect*fromtest03wherec1=a1andc2=a2'andc3=a3'andc4=a4'

 

四、MySQL 逻辑架构

和其他数据库相比,MySQL 有点与众不同,它的架构可以在多种不同的场景中应用并发挥良好的作用,主要体现在存储引擎的架构上。

插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。

这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

image.png

连接层:

最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似 tcp/ip 的通信。

服务层:

第二层架构主要完成大多数的核心服务,如 SQL 接口,并完成缓存的查询,SQL 的分析进而优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。

在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的顺序,是否利用索引等,最后生成相应的执行操作。

如果是 select 语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读的操作的环境下能够很好的提升系统的性能。

引擎层:

存储引擎层,存储引擎真正的负责了 MySQL 中的数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

存储层:

数据存储层,主要是将数据存储在运行于裸机设备的文件系统之上,并完成与存储引擎的交互。

MySQL 是如何优化和执行查询的。

一旦理解了这一点,就会发现:很多的查询优化工作实际上就是遵循一些原则让MySQL 的优化器能够按照预想的合理方式运行而已。

当向 MySQL 发送一个请求的时候,MySQL 到底做了些什么呢?

下图展示了 MySQL 的查询过程。

//使用绝对权值匹配

1)

explain select*from test03 where c1=a1'and c2='a2' and c3=a3'and c4='a4',

2)

explain select*from test03 wherec1=a1'andc2=a2and c4=a4'and c3=a3'

3)

explain select * from test03 where c1='a1'and c2='a2' and c3>'a3' and c4='a4'

4)

explain select * from test03 where c1='a1' and c2='a2' and c4>'a4' and c3='a3':

5)

explain select*from test03 where c1='a1' and c2='a2' and c4='a4' order byc3:

c3

作用在排序而不是查找

6)

explain select * from test03 where c1='a1' and c2='a2' order by c3

7)

explain select*from test03 where c1='a1' and c2=a2' order by c4,

8)

8.1

explain select * from test03 where c1='a t"and c5='a5' order by c2.c3,

只用 c1一个字段索引,但是 c2c3 用于排序,filesort

8.2

explain select * from test03 where c1='a 1' and c5='a5' order by c3.c2:

出现了 filesort ,我们建的索引是 1234,它没有按照顺序来,32 颠倒了

9)

explain select * from test03 where c1='a 1' and c2='a2'order by c2.c3.

10)

explain select *from test03 where c1='a 1' and c2='a2 and c5='a5' order by

c2.c3 用 c1c2 两个字段索引,但是 c2c3 用于排序,filesort

expiain select* from test03 where c1='a1'and c2='a2'and c5='a5' order by c3,c2;

本例有常量 c2 的情况,和8.2对比

explain selec! * from test03 where c1='a !' and c5='a5' order by c3.c2, filesort

11)

explain select * from test03 where c1='a1' and c4='a4' group by c2.c3:

定值、范围还是排序,一般orderby是给个范围 groupby基本上都需要进行排序,会有临时表产生

查询优化:

经过前面的步骤生成的语法树被认为是合法的了,并且由优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。

优化器的作用就是找到这其中最好的执行计划。

MySQL 使用基于成本的优化器,它尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。

MySQL 可以通过查询当前会话的 last_query_cost 的值来得到其计算当前查询的成本。

一般性建议:

1.对于单键索引,尽量选择针对当前 query 过滤性更好的索引

2.在选择组合索引的时候,当前 Query 中过滤性最好的字段在索引字段顺序中,位置越靠前越好。

3.在选择组合索引的时候,尽量选择可以能够包含当前 query 中的 where 字句中更多字段的索引

4.尽可能通过分析统计信息和调整 query 的写法来达到选择合适索引的目的

5.使用索引可加快数据检索速度,但为每个列都建立索引没有必要。因为索引自身也需要维护,并占用一定的资源,可以按照以下标准选择建立索引的列

*频繁搜索、查询选择的列

*经常排序、分组的列

*经常用于连接的列(主键、外键)

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
2天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:1000万级大表, 如何 加索引?
45岁老架构师尼恩在其读者交流群中分享了如何在生产环境中给大表加索引的方法。文章详细介绍了两种索引构建方式:在线模式(Online DDL)和离线模式(Offline DDL),并深入探讨了 MySQL 5.6.7 之前的“影子策略”和 pt-online-schema-change 方案,以及 MySQL 5.6.7 之后的内部 Online DDL 特性。通过这些方法,可以有效地减少 DDL 操作对业务的影响,确保数据的一致性和完整性。尼恩还提供了大量面试题和解决方案,帮助读者在面试中充分展示技术实力。
|
2月前
|
存储 关系型数据库 MySQL
贝壳面试:什么是回表?什么是索引下推?
在40岁老架构师尼恩的读者交流群中,近期有成员获得了得物、阿里、滴滴等一线互联网企业的面试机会,遇到了诸如“MySQL索引下推”、“回表查询”等重要面试题。由于缺乏准备,部分成员未能通过面试。为此,尼恩系统地整理了相关知识点,帮助大家提升技术实力,顺利通过面试。具体内容包括MySQL的架构、回表查询的工作原理及其性能问题、索引下推的底层原理和优势等。此外,尼恩还提供了优化建议和实战案例,帮助大家更好地理解和应用这些技术。尼恩的技术资料《尼恩Java面试宝典PDF》也收录了这些内容,供后续参考。
贝壳面试:什么是回表?什么是索引下推?
|
2月前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。
|
4月前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
4月前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
109 4
|
4月前
|
索引
【面试题】串联所有单词的子串,找到所有符合条件的串联子串的起始索引
【面试题】串联所有单词的子串,找到所有符合条件的串联子串的起始索引
55 0
|
5月前
|
SQL 缓存 关系型数据库
面试题MySQL问题之实现覆盖索引如何解决
面试题MySQL问题之实现覆盖索引如何解决
62 1
|
5月前
|
存储 SQL 索引
面试题MySQL问题之使用SQL语句创建一个索引如何解决
面试题MySQL问题之使用SQL语句创建一个索引如何解决
58 1

热门文章

最新文章