MySQL 高频面试题目(3)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: MySQL 高频面试题目(3)

五、为什么不用红黑树?

红黑树也是BST,但是不是严格平衡的,通过变色和旋转来保持平衡。

必须满足5个约束:

1,节点分为红色或者黑色。

2,根节点必须是黑色的

3,叶子节点都是黑色的NULL节点

4,红色节点的两个子节点都是黑色(不允许两个相邻的红色节点)

5,从任意节点出发,到其每个叶子节点的路径包含相同数量的黑色节点


基于以上规则可以推导出:

从根节点到叶子节点的最长路径(红黑相间的路径)不大于最短路径(全节点的二倍)

为什么不用红黑树?1,只有两路 2,不够平衡


红黑树一般只放在内存里边用,例如:java的TreeMap,它可以用来实现一致性哈希。


六、MySQL中索引的数据结构——B树索引和Hash索引

Hash索引:以KV的形式检索数据,也就是说,它会根据索引字段生成hash码,指针指向数据(memory存储引擎可以使用Hash索引)


image.png


Hash索引的优点:(1) 时间复杂度O(1),查询速度比较快,因为Hash索引里边的顺序存储,所以不能用于排序。

(2)查询数据的时候要根据键值计算哈希吗,所以它只能支持等值查询,不支持范围查询,和排序,在有大量重复键值情况下,哈希索引的效率是极低的,因为存在所谓的哈希碰撞问题。


B+树索引


MyISAM: 其中包含三个配置文件 frm 表的结构和定义信息,myd 表的数据,myi 表的索引


image.png


MyISAM的B+Tree里边,叶子节点村粗的是数据文件对应额磁盘地址,所以从索引文件.MYI中找到键值后,会到数据文件.MYD中获取相应的数据记录。


image.png


非主键索引和主键索引数据的方式是没有任何区别的,一样是在索引文件中找到磁盘地址,然后到数据文件里边获取数据。


image.png


InnoDB:


image.png


在InnoDB的某个索引的叶子节点上,它直接存储了我们的数据。所以,在InnoDB中索引即数据,就是这个原因。


聚集索引的概念:就是索引键值的逻辑顺序跟表数据行的物理存储顺序是一直的。

InnoDB组织数据的方式就是(聚集)索引组织表(clustered index organize table)。如果一张表创建了主键索引,那么这个主键索引就是聚集索引,决定数据行的物理存储顺序。


image.png


InnoDB中,主键索引和辅助索引有主次之分,如果主键有索引,那么主键索引就是聚集索引。其他的索引统一叫做“二级索引”(secondary index)。


二级索引检索数据的流程是这样的:

当我们用Name索引查询一条纪律,它会在二级索引的叶子节点找到了Name=qingshan,拿到了主键值,也就是Id=1,然后再到主键索引的叶子节点拿到数据。为什么不存地址而是存储键值?因为地址会变化。


从这个角度来讲,因为主键索引比二级索引少扫描了一颗B+ Tree(避免了回表,),它的速度会快一点。


七、主键索引的选取与加索引的技巧

主键索引的选取:

1,如果我们定义了主键(Primary key ),那么InnoDB会选择主键作为聚集索引。

2,如果没有显示定义主键,则InnoDB会选择第一个不包含NULL值的唯一索引作为主键索引。

3,如果也没有这样额唯一索引,则InnoDB会选择内置6自己长的RowID作为隐藏的聚集索引,他会随着行记录的写入而主键递增。


加索引的一些技巧:

1,列的离散度,(列的全部不同值)/所有数据的比例 简单的说列的重复值越多,离散度就越低;重复值越少,离散度就越高。 对于离散度高的,即使加了索引,查询消耗的时间更多了,在B+ Tree里边的重复值太多,MySQL的优化器发现走索引跟使用全表扫描差不多的时候,就算建了索引,也不一定会走索引。

对于离散度低的字段,不建议加索引

2,联合索引最左匹配

当我们创建三个字段的索引Index (name,age,address),相当于创建了三个索引:

Index(a)

Index(a,b)

Index(a,b,c)


3,覆盖索引

回表: 非主键索引先通过索引找到主键索引的值,再通过主键值查询索引里边没有的数据,它比基于主键索引的查询多扫描了一棵索引树,这个过程就叫回表。


在二级索引里边,不管是单列索引还是联合索引,如果select的数据列只用从索引中就能够取得,不必从数据区中读取,这时候使用的索引就叫做覆盖索引,这样就避免了回表。

因为覆盖索引减少了IO次数,减少了数据的访问量,可以大大地提升查询效率。


4,索引条件下推

索引条件下推(Index Condition Pushdown),5.6以后完善的功能,只适用于二级索引。ICP的目标是减少访问表的完整行的读数量从而减少I/O操作。


将 Index Filter 从 Server 层 Push Down 到了引擎层,减少了因回表产生的磁盘 I/O,也减少了与 Server 层的交互,提高了 SQL 执行效率


举一个例子:

Select * from student where age=22 and name like %明


对于MySQL 5.6之前,能够根据age=22能够查询出数据,name like %明 根据最左匹配原则索引无效,所以查询过程是这样的

(1)根据联合索引查出所有姓名wang的二级索引数据(3个主键值:)

(2)回表,到主键索引上查询所有符合条件的数据

(3)把这三条数据返回server层,在Server层过滤出以zi结尾的员工。


image.png


ICP是默认开启的,也就是说针对二级索引,只要能把条件下推给存储引擎,它就会下推,不需要我们干预。


image.png


image.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
7
分享
相关文章
浏览器常见面试题目及详细答案解析
本文围绕浏览器常见面试题及答案展开,深入解析浏览器组成、内核、渲染机制与缓存等核心知识点。内容涵盖浏览器的主要组成部分(如用户界面、呈现引擎、JavaScript解释器等)、主流浏览器内核及其特点、从输入URL到页面呈现的全过程,以及CSS加载对渲染的影响等。结合实际应用场景,帮助读者全面掌握浏览器工作原理,为前端开发和面试提供扎实的知识储备。
104 4
|
25天前
|
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
81 6
校招 Java 面试基础题目解析及学习指南含新技术实操要点
本指南聚焦校招Java面试,涵盖Java 8+新特性、多线程与并发、集合与泛型改进及实操项目。内容包括Lambda表达式、Stream API、Optional类、CompletableFuture异步编程、ReentrantLock与Condition、局部变量类型推断(var)、文本块、模块化系统等。通过在线书店系统项目,实践Java核心技术,如书籍管理、用户管理和订单管理,结合Lambda、Stream、CompletableFuture等特性。附带资源链接,助你掌握最新技术,应对面试挑战。
52 2
Java 校招面试题目合集及答案 120 道详解
这份资料汇总了120道Java校招面试题目及其详细答案,涵盖Java基础、JVM原理、多线程、数据类型、方法重载与覆盖等多个核心知识点。通过实例代码解析,帮助求职者深入理解Java编程精髓,为校招面试做好充分准备。无论是初学者还是进阶开发者,都能从中受益,提升技术实力和面试成功率。附带的资源链接提供了更多学习材料,助力高效备考。
67 3
校招 java 面试基础题目及解析
本文围绕Java校招面试基础题目展开,涵盖平台无关性、面向对象特性(封装、继承、多态)、数据类型、关键字(static、final)、方法相关(重载与覆盖)、流程控制语句、数组与集合、异常处理等核心知识点。通过概念阐述和代码示例,帮助求职者深入理解并掌握Java基础知识,为校招面试做好充分准备。文末还提供了专项练习建议及资源链接,助力提升实战能力。
96 0
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。

热门文章

最新文章

推荐镜像

更多
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等