MySQL常见面试题(三)

2023-09-20 06:37:31

😀前言
在当今数据驱动的时代,数据库管理成为企业和组织的核心组件。其中,数据库的性能优化是确保信息可以快速、准确地检索的关键要素。这通常通过正确实现和管理数据库索引来实现。索引不仅可以大大提高数据库的查询性能,还可以帮助维持数据的完整性和一致性。本文将深入探讨MySQL数据库中的不同类型的索引,包括其特点和实现方式。我们还将讨论如何有效地使用这些索引来优化数据库性能,以及选择索引结构的重要性。

🏠个人主页:尘觉主页
在这里插入图片描述

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

在csdn获奖荣誉: 🏆csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🥰阿里云专家博主
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 😉亚马逊DyamoDB结营

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

简单描述MySQL各个索引的区别

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。

主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。

索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。

MySQL的索引对数据库的性能有什么影响

索引(Index)是帮助MySQL高效获取数据的数据结构,所以索引可以极大的提高数据的查询速度。

但是每建立一个索引都要为它建立一棵B+树,一棵很大的B+树由许多数据页组成会占据很多的存储空间。

而且每次对表中的数据进行增、删、改操作时,都需要去修改各个B+树索引,同时这些操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位,页面分裂、页面回收的操作来维护好节点和记录的排序。如果我们建了许多索引,每个索引对应的B+树都要进行相关的维护操作,这必然会对性能造成影响。

为什么MySQL的索引要使用B+树而不是B树?

答案见下一小节

InnoDB一棵B+树可以存放多少行数据?

当然在实际的数据库中,一个节点可以存储的数据可以很多,为什么?

计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是 4k,而对于我们的 InnoDB 存储引擎也有自己的最小储存单元——页(Page),一个页的大小是 16K。Innodb 的所有数据文件(后缀为 ibd 的文件),他的大小始终都是 16384(16k)的整数倍。

数据表中的数据都是存储在页中的,所以一个页中能存储多少行数据呢?假设一行数据的大小是 1k,那么一个页可以存放 16 行这样的数据。

对于B+树而言,只有叶子节点存放数据,非叶子节点存放的是只保存索引信息和下一层节点的指针信息。一个非叶子节点能存放多少指针?

其实这也很好算,我们假设主键 ID 为常用的bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170个。

那么可以算出一棵高度为2的B+树,存在一个根节点和若干个叶子节点能存放 1170*16=18720 条这样的数据记录。

根据同样的原理我们可以算出一个高度为 3 的
**B+ **树可以存放: 1170117016=21902400 **条这样的记录。

所以在 InnoDB 中 B+ 树高度一般为 1-3 层,就能满足千万级的数据存储。

那么为什么MySQL****的索引要使用B+树而不是B树?

而 B 树和B+树的最大区别就是,B 树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致 IO 操作变多,查询性能变低。

HashMap适合做数据库索引吗?

1、hash表只能匹配是否相等,不能实现范围查找;

2、当需要按照索引进行order by时,hash值没办法支持排序;

3、组合索引可以支持部分索引查询,如(a,b,c)的组合索引,查询中只用到了阿和b也可以查询的,如果使用hash表,组合索引会将几个字段合并hash,没办法支持部分索引;

4、当数据量很大时,hash冲突的概率也会非常大。

😄总结

通过深入探讨MySQL数据库中的多种索引类型和其特点,我们得出结论,适当的索引选择和实现对于优化数据库性能至关重要。我们详细讨论了B+树索引和其优势,特别是与B树和哈希映射相比。我们了解到,虽然哈希映射在特定场景下可以非常有用,但它们的功能限制和性能问题通常使它们不适合用作数据库索引。

总的来说,一个好的索引策略应该考虑到数据库的具体需求和工作负载。为了实现最优性能,数据库管理员和开发人员需要深入了解不同类型的索引和他们的优缺点,以便能够做出明智的决策。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

更多推荐

SpringBoot 的版本、打包、Maven

一、SpringBoot结构、集成1.1、集成组件SpringCore:Spring的核心组件,提供IOC、AOP等基础功能,是Spring全家桶的基础。SpringBoot:一个基于SpringFramework的快速开发框架,可以快速创建独立的、生产级别的Spring应用程序。SpringCloud:一个用于构建分

MySQL与PostgreSQL对比

MySQLPostgreSQL数据类型支持支持JSON,但不如PostgreSQL支持更多的数据类型,如数组、hstore、JSON、JSONB、范围类型等扩展性有一些扩展性,但不如PostgreSQL支持自定义数据类型、函数、操作符,具有强大的扩展性SQL兼容性遵循SQL标准,但有一些自定义扩展更接近ANSISQL标

RT-Thread 访问I/O设备

访问I/O设备应用程序通过I/O设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。查找设备:应用程序根据设备名称获取设备句柄,进而操作设备。获得设备句柄后,应用程序可使用如下函数对设备进行初始化操作:rt_err_trt_device_init(rt_device_tdevice);当一个设备已经

ROS2 的行为树 — 第 1 部分:解锁高级机器人决策和控制

一、说明在复杂而迷人的机器人世界中,行为树(BT)已成为决策过程中不可或缺的一部分。它们提供了一种结构化、模块化和高效的方法来对机器人的行为进行编程。BT起源于视频游戏行业,用于控制非玩家角色,他们在机器人领域找到了归宿,他们擅长管理无数的任务和条件。用于机器人导航的Nav2和操作框架MoveIt等机器人软件使用行为树

【数据结构与算法】概论

(多选题,3分)设n为算法中的问题规模,通常用()渐进符号表示算法的执行时间与n之间的一种增长关系。A.ΟB.ΘC.ΩD.ΣE.Φ正确答案:ABC解析:Ο是渐进上界,Ω是渐进下界。Θ需同时满足大Ο和Ω,故称为确界(必须同时符合上界和下界)。Ο极其有用,因为它表示了最差性能。Θ,读音:西塔;既是上界也是下界(tight)

电力系统直流潮流分析【N-1】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码及文档讲解💥1概述该程序接受一个感受矩阵B=[NxN]和注入功

springboot集成mybatis-plus

一、在springboot中配置mybatis-plus1、创建一个springboot项目,注意勾选mysql2、在pom.xml文件中添加mybatis-plus的依赖包<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.or

SpringBoot 集成 SpringSecurity 从入门到深入理解

完整的目录介绍SpringSecurity简述SpringSecuritySpringSecurity的主要功能说明项目源码入门案例项目工程路径第一步:加载依赖第二步:创建核心的配置类第三步:增加controller第三步:启动程序小结界面跳转说明密码生成说明重点内容扫盲重要的FilterPasswordEncoder

学习计算机网络中的一些疑问及解答

文章目录前言一、为什么要进行三次握手二、三次握手的流程三、三次握手中seq和ack的值四、四次挥手流程五、四次挥手中seq和ack的值六、为什么要等待才回复七、为什么等待2MSL总结前言一个本硕双非的小菜鸡,备战24年秋招,在学习计算机网络的过程中遇到了一些问题,思考并解答。部分参考小林大佬的解答:小林coding一、

IntelliJ IDEA下基于Scala实现的Git检查工具

本文使用Scala实现自定义的Git检查工具,读者可以基于本文的示例进行扩展与实现,也可以进行其他应用方向的尝试。01、Git检查工具在实现Git检查工具之前需要知道程序究竟要做什么。我们知道,在管理Git分支时可以进行代码合并操作,这样可以将其他开发者提交的内容同步到当前分支中,当用户对自己的分支进行提交时就不会与现

深入理解 Java 异步编程:Future 和 CompletableFuture 的全面比较

深入理解Java异步编程:Future和CompletableFuture的全面比较FutureCompletableFuture选择适合的场景和需求:理解Future和CompletableFuture的底层实现、用法以及它们的优劣势对深入了解这两个概念非常重要。我将从底层开始,详细解释它们,然后根据不同场景和需求讨

热文推荐