面试题:MySQL 索引

news2024/11/27 18:45:43

1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引)

MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据:

  1. IO效率的提高:在MySQL数据库中,表的真实数据和索引数据都是存储在磁盘中,进行数据读写时必然涉及到IO问题。IO是硬件层面的问题,我们在做索引设计时需要尽可能提高IO效率。通常来说,提高IO效率主要有两个方面:减少IO次数和减少IO量。

  2. 分块读取数据:数据存储量是不可预估的。当表的数据量非常大时,我们无法一次性将所有数据读取到内存中,因此需要分块读取数据。在分块读取时,我们需要设计合理的块大小。

  3. 数据存储的局部性:数据在磁盘存储时具有时间局部性和空间局部性,内存和磁盘在进行数据交互时并不会逐一读取数据,而是会将相关数据加载到内存中。加载时有一个基本的逻辑单位称为页,页的大小一般是4KB或8KB,具体取决于操作系统。在数据读取时通常会选择页的整数倍读取,例如InnoDB存储引擎每次读取16KB的大小。这与分块读取的设计思想一致,因此块大小通常选择页的整数倍。在MySQL中,默认情况下页的大小是16KB,可以通过参数进行调整,例如InnoDB中的innodb_page_size参数,但一般情况下不调整这个参数。

  4. 数据格式设计:确定块大小后,我们需要设计数据格式。使用索引时通常是根据一个或多个索引列的值读取整行数据或部分字段,例如SELECT * FROM table WHERE id = 10根据id值检索整行记录。因此,数据格式设计为K-V格式,其中K值是索引列的值,V值的设计需要进一步考虑。

  5. 直接存储行记录:通常情况下,当需要从磁盘读取某行记录时,需要知道一些信息才能定位到数据,如文件名、偏移量和数据长度。这些信息可以用于定位任意行记录。如果将这些信息作为索引信息,在读取数据时首先需要打开一个文件,读取这些信息,然后根据这些信息找到对应的数据文件读取具体行数据。如果每次打开文件即一次IO操作,则至少需要2次IO操作才能读取到数据,不符合减少IO次数的原则。因此,最好的方式是在V中直接存储行记录,这样读取数据时可以直接根据K值读取行记录,将数据和索引绑定存储。在MySQL中,InnoDB存储引擎就是这样存储的,数据文件和索引文件都位于后缀名为ibd的文件中。

  6. 选择数据结构:确定数据格式后,我们需要选择合适的数据结构存储数据。支持K-V格式的数据结构有很多,例如哈希表、二叉树、BST、AVL、红黑树等。MySQL最终选择了B+树,下面对比一下各个数据结构的区别:

    • 哈希表:哈希表可以存储数据,但本质上是无序散列表,因此在进行范围查询时需要逐一比较数据,效率较低。此外,哈希表存在哈希碰撞或冲突问题,需要设计性能优良的哈希算法,因此不适用。但在MySQL中,MEMORY存储引擎支持哈希索引,InnoDB存储引擎支持自适应哈希。

    • 二叉树、BST、AVL、红黑树:这些树可以支持K-V格式的数据存储,但它们最多只有两个分支。在进行数据存储时,一个三层的树最多可以存储7个数据,数据量较少。若想存储更多数据,只能增加树的高度,但树的高度增加会导致IO次数增加,影响查询效率。因此需要考虑在保证树高度不变的情况下存储更多数据。因此,B-树应运而生。

    • B-树:B-树在每个数据块中包含三种类型的数据:key值、行记录和指针。读取数据时只需逐层向下检索即可。假设一个数据块大小为16KB,读取48KB数据即可获取所查询的记录。一个三层的B-树最多可以存储4095条记录,数据量依然较少,若想存储更多数据只能增加树的高度,影响查询效率。因此需要优化数据结构。
      在这里插入图片描述

    • B+树:B+树将所有数据都存储在叶子节点,非叶子节点只存储key值和指针。检索数据时可以从根节点向下检索,也可以在叶子节点中进行前后检索。假设一个数据块大小为16KB,key和指针总大小为10字节,一个三层B+树最多可以存储42928704条记录,相较于B-树存储的数据量更大。
      在这里插入图片描述
      因此,MySQL最终选择B+树作为数据结构进行存储。通常情况下,3-4层的B+树足以支持千万级别的数据量存储。

2. 索引有哪些分类?

索引的分类可从不同角度进行区分:

  1. 从数据结构角度:B+树索引、哈希索引、全文索引(FULLTEXT)、R-Tree索引(用于对GIS数据创建SPATIAL索引)。
  2. 从物理存储角度:聚簇索引和非聚簇索引。
  3. 从逻辑角度:主键索引、普通索引、唯一索引、组合索引。

3. 聚簇索引与非聚簇索引

在这里插入图片描述
在MySQL的InnoDB存储引擎中,数据插入时必须与某个索引列绑定存储。如果存在主键,则选择主键;若无主键,则选择唯一键;若无唯一键,系统会生成一个6字节的rowid进行存储。

  • 聚簇索引:与数据绑定存储的索引称为聚簇索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最细哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)来源于代码随想录,十分感谢这位我失散多年的老师!!

20240725 一、什么时候适用什么样的结构。1.java中1.1 HashSet:1.2 TreeSet:1.3 LinkedHashSet:1.4 HashMap:1.5 TreeMap:1.6 LinkedHashMap:1.7 总结 2. c中2.1 std::unordered_set:2.2 std::s…

mysql 的MHA

mysql 的MHA 什么是MHA 高可用模式下的故障切换,基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要3台。 故障切换过程0-30秒。 vip地址,根据vip地址所在的主机,确定主备。 主 vip 备 vip 主和备不是优先确定的&#xff…

机器视觉13镜头

镜头作用: 一端收集物体的光线,并将光线在另一端汇聚为实像,并投影到接收面的物体。 此时,汇集光线的点称为焦点,镜头中心到焦点的距离称为焦点距离。 当镜头为凸镜时,焦点距离将根据镜头的厚度&#xf…

必看!CRM系统选型指南:10款CRM系统对比,你该用哪个?

不同行业、不同规模、不同业务模式的企业,对CRM系统的需求千差万别。 如何在众多选择中挑选出最适合自己企业的那一款,成为了许多管理者面临的难题。因为,如今的CRM系统成为了企业提升竞争力、深化客户关系、优化业务流程的关键工具。 因此…

【嵌入式】C51 和标准 C 语言的关键字对比详解

目录 C51 和标准 C 语言的关键字对比详解1. 概述2. C51 和标准 C 语言的关键字对比2.1 关键字对比表2.2 对比表详细解释2.2.1 C51 特定关键字2.2.2 标准 C 语言关键字 2.3 C51 特定关键字2.4 标准 C 语言关键字 3. 示例详细解释3.1 C51 特定关键字bitsfrsbitdataidatapdataxdat…

基于JSP的水果销售管理网站

你好,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言: Java 数据库: MySQL 技术: JSP技术 工具: 未在文档中明确指出,可能包括但不限于IDEs(如Ec…

.NET 相关概念

.NET 和 .NET SDK .NET 介绍 .NET 是一个由 Microsoft 开发和维护的广泛用于构建各种类型应用程序的开发框架。它是一个跨平台、跨语言的开发平台,提供了丰富的类库、API和开发工具,支持开发者使用多种编程语言(如C#、VB.NET、F#等&#xf…

盘点2024年网上很火的4个语音识别转文字工具。

语音识别转文字是一项非常实用的技术,可以帮助我们在会议记录中省去手动记录,在采访中迅速得到文字稿,在学习中快速生成课堂笔...运用十分广泛。但是很多人不知道要怎么转换,在这里我便给大家介绍几款效率非常高的语音转文字的工具…

Java微服务架构设计:Spring Boot与Spring Cloud实践

1. 引言 1.1 微服务架构概述 微服务架构是一种将单个应用程序划分为一组小型服务的方法,每个服务运行在其独立的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务能力构建,并且可以由全自动部署…

如何保证分布式服务接口的幂等性

1 问题背景 可能你最先想到的就是使用数据库的事务保证。比如创建订单时,要同时往订单表和订单商品表中插入数据,那这些插入数据的INSERT必须在一个数据库事务中执行,数据库的事务可以确保:执行这些INSERT语句,共赴生死…

DDR核心和事务调度程序(DDRC)

DDR Core and Transaction Scheduler (DDRC)是内存管理系统中一个关键组件,它主要负责管理和调度对DDR(Double Data Rate,双倍数据率)内存的读写操作。这个组件对于确保系统能够高效地访问内存至关重要,特别是在处理多…

实验15.多线程调度

简介 实验.多线程调度 内核线程 1.在时钟中断函数中处理中,减少当前线程pcb的tick,tick为0则启动调度2.调度,把当前线程pcb放入就绪对立队尾,把就绪线程队首拿出来执行主要代码 引导 省略内核 list.h #ifndef __LIB_KERNEL_…

【GoodERP更新日志】增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能

开源项目GoodERP更新-2024年7月29日 本次提交合并增加的功能或解决的问题: 1、增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能(增加上了批量抵扣记账(会检查发票号、开票日期有没有填写上)、批量撤销入账 两个批量功能…

H616设计时候存在的问题

1.存在大量孤铜的问题: 这种情况是绝对不允许的,但是GBA焊盘打大量的过孔会出现很多这样的孤铜: 解决办法: 像这种出现大量重复焊盘的,用导线连接起来,之后铺铜形成铜皮,再在这个小铜皮上面打…

用frp内网穿透https网站

场景说明 在微信小程序上线测试的时候,自主开发的后端服务在公司局域网,小程序前端在微信公众平台只支持配置https协议的域名来访问服务端。公司一直在使用frp内网穿透工具实现公网访问公司局域网服务,因此,研究如何实现frp代理h…

低代码平台飞书apaas

1. 低代码平台 1.1 概述 低代码是无需编码(0 代码)或通过少量代码就可以快速生成应用程序的开发平台。 通过可视化进行应用程序开发的方法,具有不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动的逻辑来…

BIM、数字孪生、可视化一结合,我就知道这大屏效果稳稳的啦

在日常的项目中,经常会用到上述三个方面的能力结合,比如智慧工地、智慧楼宇、智慧园区等项目,本文就分享一批这方面的精彩作品。 BIM(建筑信息模型)、数字孪生和可视化大屏可以结合起来,为建筑行业和工程管…

C语言中的二维数组

文章目录 🍊自我介绍🍊二维数组🍊代码实战 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello,大家好,我是小珑也要变强&…

AI 绘画是否符合当代主流审美?

在当今时代,AI 绘画成为了一个备受关注的热门话题。那么,AI 绘画是否符合当代主流审美呢? AI 绘画有着诸多符合当代审美的特质。它能展现出独特的视觉效果,风格丰富多样,如后现代风格、奇幻风格等等,足以满…

前端必备基础【网络通信】(2024最新版)

Ajax Asynchronous Javascript and XML 的缩写,是使用 JS 发起网络通信的技术统称,具体步骤为: 创建 XMLHttpRequest 实例发出 HTTP 请求接收服务器传回的数据更新网页数据(通常是部分内容,而不是整个网页&#xff09…