【浅学Java】MySQL索引七连炮

news2024/11/25 15:39:10

MySQL索引面试七连炮

  • 0. 谈一下你对索引的理解
  • 1. MySQL索引原理和数据结构能介绍一下吗
  • 2. B+树和B树的区别
  • 3. MySQL聚簇索引和非聚簇索引的区别
  • 4. 使用MySQL索引都有什么原则
    • 4.1 回表
    • 4.2 索引覆盖
    • 4.3 最左匹配
    • 4.4 索引下推
  • 5. 不同的存储引擎是如何进行数据的存储的
  • 6. MySQL组合索引的结构是怎样的
  • 7. MySQL索引是如何进行优化的

0. 谈一下你对索引的理解

首先。MySQL里面存的一些索引,索引的数据结构是通过B+树或者哈希表生成的。

存储引擎:
对于不同类型的索引,是与存储引擎相关的,如果你使用的是Myisam或者Innodb这样的存储引擎,那对应的数据类型就是B+树;如多使用的Memory这种存储引擎,那所使用的数据结构就是哈希表。不同的存储引擎表示的是不同的数据在磁盘上的组织形式。

为什么InnoDB和Myisam要使用B+树呢?
首先,我们得清楚,索引里面存储得是什么。一般情况下,索引里面存储的是Key,通过key去找到对应的value。对于这种key-value形式的数据,我们可以采用的数据结构有很多选择,比如:哈希表、二叉树、AVL树、B+树。

不管使用什么形式的二叉树,它最终都会导致树高度的增高,这就会使io的次数增多,使得整体的io访问的效率降低。而不使用哈希表是因为它不支持范围查找。

选择B+树这样的数据结构之后,他就会尽多的在一个数据节点里面存储数据,让树的高度变低,从而减少io的次数,提高数据访问的效率。

索引分类:
在MySQL里面有主键索引、唯一性索引、普通索引、组合索引、全文索引等各种索引。在日常的开发中,最常用到的可能就是主键索引和组合索引,在使用这两种索引的时候,会存在一系列问题,比如:回表、覆盖索引、最左匹配、索引下推。

在执行SQL语句的时候,可以通过索引的一些点来进行优化,提高我们对于数据的访问效率。

1. MySQL索引原理和数据结构能介绍一下吗

MySQL的索引底层使用B+树来进行数据的存储。
使用B+树的优点:

  1. B+树是一个多叉搜索树,可以进行数据的查找操作
  2. B+树的非叶子节点只存储Key值,这样就可以在一个数据节点里面存储更多的数据,从而降低树的高度,减少IO访问的次数,从而提高数据查询的效率。
  3. B+树的叶子节点存储数据的详细信息,每个数据在叶子节点上都有体现,并且这些叶子节点用链表的形式连接起来,从而支持范围查找。

2. B+树和B树的区别

我们先来看看两种数据结构的数据存储模型图:
在这里插入图片描述
下面来总结一下两者的区别:

  1. B树的键值分布在整个树中;而B+只在叶子节点存储键值,非叶子节点只存储Key值
  2. B+树的叶子节点是以链表的形式进行存储,可以支持范围查询;而B树不行
  3. B+树的数据节点中只存储Key,而B树的数据节点中还存储data,这就意味着B+树单次磁盘 IO 的信息量大于B树,从这点来看B+树相对B-树磁盘 IO 次数少

3. MySQL聚簇索引和非聚簇索引的区别

想要理解聚簇索引和非聚簇索引的区别,那我们先来理解一下下面的这些东西:

对于InnoDB存储引擎,在插入数据的时候,数据必须和索引绑定到一起,索引可以是主键,可以是唯一性键,也可以是6字节的rowid。

在一个表中,可能有多个索引,但是数据只能有一份,不会造成文件的冗余。当数据跟某一个索引列绑定到一起的时候,其他的索引列应该如何检索数据呢?

方法是:将 已经跟数据绑定的索引列的值 放到其他索引的叶子节点。

id为主键时,用主键建立的索引结构:
在这里插入图片描述

而id为主键时,以name建立的索引:
在这里插入图片描述

  1. InnoDB是通过B+树结构对主键创建索引,然后叶子节点存储记录,如果没有主键,就用唯一性键创建索引,如果没有唯一性键,就用6字节的row_id来作为主键创建索引。
  2. 如果创建索引的键是其他字段,那么在叶子节点存储的就是该记录的主键,然后再通过主键索引来找到对应的记录,这就做回表

理解了上面这些,再来谈谈聚簇索引和非聚簇索引:

聚簇索引:索引跟数据放到一起,比如上面的 id
非聚簇索引:索引跟数据没有直接放到一起,需要通过回表才能查询到数据,比如上面的name

还有一个小知识:

  1. 在InnoDB存储引擎当中,既存在聚簇索引,也存在非聚簇索引。
  2. 在myisam存储引擎当中,只存在非聚簇索引,根本原因是:myisam存储引擎索引列单独是一个文件

4. 使用MySQL索引都有什么原则

4.1 回表

从某一个索引的叶子节点拿到聚簇索引的id值,然后再根据id值去聚簇索引里面找到对应的全量信息。设计回表查询的效率不高,一次回表使io次数翻倍,要尽量减少回表。

假设有一个表:id,name,age,gender四个列,id为主键,name为普通索引

当执行 select * from table where name = "zhangsan"时,它得先在name索引中找到主键id的值,然后再去id索引中查询全列信息。

4.2 索引覆盖

从索引的叶子节点中,能获取全量查询列的过程就叫做覆盖索引,覆盖索引不需要再回表。

假设有一个表:id,name,age,gender四个列,id为主键,name为普通索引

当执行 select id,name from table where name = "zhangsan"时,再name索引中,可以查到id,也可以查到name,此时就不需要再进行回表。

4.3 最左匹配

对于组合索引,要遵循最左匹配原则,即:索引的匹配顺序必须是从左向右。

假设有一个表:id,name,age,gender四个列,id为主键,name和age为组合索引

当执行如下语句的时候,那些能用到组合索引?

select * from table where name="zhangsan" and age=10;
select * from table where name="zhangsan";
select * from table where age=10;
select * from table where age=10 and name="zhangsan";

答案是:1,2,4可以使用组合索引。原因如下:

第1个是标准的顺序,没问题
第2个是查询name,符合最左匹配,也没问题
第3个把name跳过了,不符合组合索引的要求
第4个是mysql索引优化器对索引的顺序进行了调整,因为age和name的顺序对查询结果没有影响。

4.4 索引下推

MySQL的组成部门:
在这里插入图片描述

当执行 select * from table where name=“zhangsan” and age=10 时

  1. 在没有索引下推之前:先根据name去存储引擎拿到全量的数据,在将数据读取到server层,然后server层再根据age进行筛选,将最终结果返回给客户端
  2. 有了索引下推之后:直接根据name和age去存储引擎拿到全量数据,然后将最终结果返回给客户端

5. 不同的存储引擎是如何进行数据的存储的

在InnoDB中:
在这里插入图片描述

frm存储表结构相关的东西
ibd存储的是实际的数据

在Myisam中:
在这里插入图片描述

frm存储表结构相关东西
MYD存储数据
MYI存储索引

两者数据的存储的区别:在InnoDB中,数据和索引存储在一起,而在myisam当中,数据和索引分开存储,这也便是myisqm只有非聚簇索引的原因。

6. MySQL组合索引的结构是怎样的

和普通索引就一个区别:key值多为多个,即(key,key)——>value.

7. MySQL索引是如何进行优化的

待沉淀。

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

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

相关文章

根据文件内容批量更改文件名称

注意的问题: ★★★待处理的文件顺序要与excel中新的文件名称顺序一致,我直接复制文件地址到excel中顺序与原来顺序不一样,也不能通过排序得到原来的顺序,这里给出一种解决办法,具体步骤见2数据预处理阶段。 1. 这是我…

最新版本OpenAI怎么调试--用Postman调试最新版OpenAI-API

动动小手指,去到openai的API介绍页面。 https://platform.openai.com/docs/api-reference/models 通过官网的提示,可以copy对应的调试命令进行测试。 本文主要通过curl命令实现。 打开Postman,对,就是那个测试接口用的postman ​…

浙江首场千人大会现场爆满!实在智能九哥专题演讲:企业数字化转型,从实在RPA开始!

为帮助众多电商商家探索数字时代下新赛道、新趋势、新方向,制定有目标、有节奏的全年生意规划,“未来电商高峰论坛暨电商生态赋能大会”于3月4日在杭州正式拉开序幕。本次大会旨在向品牌电商企业主、运营操盘手分享数字电商时代的黄金趋势及运营策略&…

【C++】30h速成C++从入门到精通(继承)

继承的概念及定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序…

数据结构——链表OJ题目讲解(1)

作者:几冬雪来 时间:2023年3月7日 内容:数据结构链表OJ题目讲解 题目来源:力扣和牛客 目录 前言: 刷题: 1.移出链表元素: 2.链表的中间结点: 3. 链表中倒数第k个结点&#xff1…

第六届省赛——8移动距离(总结规律)

题目:X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...当排满一行时,从下一行相邻的楼往反方向排号。比如:当小区排号宽度为6时,开始情形如下:1 2 3 4 5 612 11 10 9 8 713 14 1…

【论文简述】MVSTER: Epipolar Transformer for EfficientMulti-View Stereo(ECCV 2022)

一、论文简述 1. 第一作者:Xiaofeng Wang 2. 发表年份:2022 3. 发表期刊:ECCV 4. 关键词:MVS、3D重建、Transformer、极线几何 5. 探索动机:融合多视图代价体很关键,现有的方法效率低,引入…

【Git】P2 分支(创建分支,合并分支,分支冲突,分支分类)

分支分支的概念2077 与 分支git - 分支分支语句查看与创建分支切换与删除分支合并分支分支冲突分支分类分支的概念 什么是分支? 2077 与 分支 我最喜欢的游戏就是 赛博朋克2077,美国末日 和 GTA,下图是2077的存档。 存档非常多的原因是因为…

JavaScript 语句、注释和代码块实例集合

文章目录JavaScript 语句、注释和代码块实例集合JavaScript 语句JavaScript 代码块JavaScript 单行注释JavaScript 多行注释使用单行注释来防止执行使用多行注释来防止执行JavaScript 语句、注释和代码块实例集合 JavaScript 语句 源码 <!DOCTYPE html> <html> &…

Springboot 读取模板excel信息内容并发送邮件, 并不是你想想中的那么简单

Springboot 读取模板excel信息内容并发送邮件 背景技术选型搭建过程数据加密隐藏问题暴露背景追溯解决背景 在我们日常开发中, 会遇到这样一种场景, 就是读取表格中的数据, 并将数据以附件的形式通过邮箱发送到表格中的每个人 即: excel 读取 excel 写入 发送邮件(携带附件), 例…

Volsdf Sampling algorithm

l论文作者开发一个算法计算抽样S方程中使用 I(c,v)≈I^S(c,v)∑i1m−1τ^iLiI(\boldsymbol{c}, \boldsymbol{v}) \approx \hat{I}_{\mathcal{S}}(\boldsymbol{c}, \boldsymbol{v})\sum_{i1}^{m-1} \hat{\tau}_{i} L_{i} I(c,v)≈I^S​(c,v)i1∑m−1​τ^i​Li​ 首先是通过利用…

小区业主入户安检小程序开发

小区业主入户安检小程序开发 可针对不同行业自定义安检项目&#xff0c;线下安检&#xff0c;线上留存&#xff08;安检拍照/录像&#xff09;&#xff0c;提高安检人员安检效率 功能特性&#xff0c;为你介绍小区入户安检系统的功能特性。 小区管理;后台可添加需要安检的小区…

LeetCode-96. 不同的二叉搜索树

题目来源 96. 不同的二叉搜索树 递归 1.我们要知道二叉搜索树的性质&#xff0c;对于一个二叉搜索树&#xff0c;其 【左边的节点值 < 中间的节点值 < 右边的节点值】&#xff0c;也就是说&#xff0c;对于一个二叉搜索树&#xff0c;其中序遍历之后形成的数组应该是一…

分布式系统中的补偿机制设计问题

我们知道&#xff0c;应用系统在分布式的情况下&#xff0c;在通信时会有着一个显著的问题&#xff0c;即一个业务流程往往需要组合一组服务&#xff0c;且单单一次通信可能会经过 DNS 服务&#xff0c;网卡、交换机、路由器、负载均衡等设备&#xff0c;而这些服务于设备都不一…

C++:初识函数模板和类模板

目录 一. 泛型编程 二. 函数模板 2.1 什么是函数模板 2.2 函数模板的实例化 2.2.1 函数模板的隐式实例化 2.2.1 函数模板的显示实例化 2.3 函数模板实例化的原理 2.4 模板函数调用实例化原则 三. 类模板 3.1 什么是类模板 3.2 类模板的实例化 一. 泛型编程 泛型编程…

Qt广告机客户端(下位机)

目录功能结构adClient.promain.cppadclient.h 客户端adclient.cpp 客户端addate.h 时间处理addate.cpp 时间处理adsocket.h 客户端Socket处理adsocket.cpp 客户端Socket处理weather.h 天气信息处理weather.cpp 天气信息处理rollmassege.h 滚动信息处理rollmassege.cpp 滚动信息…

DCC数字管护生命周期模型解读

实话说&#xff0c;对于Digital Curation笔者真心不知道应该怎么翻译。本文借用了钱毅老师的观点&#xff0c;姑且翻译成“数字管护”&#xff0c;详见《从保护到管护&#xff1a;对象变迁视角下的档案保管思想演变》&#xff08;《档案学通讯》&#xff0c;2022年第2期&#x…

数据库基本功之SQL的数据类型

1.四种基本的常用数据类型 1.1 字符型 char # 固定字符,最长2000个 varchar2 # 可变长字符,最长4000个,最小值是1 nchar/nvarchar2 # 类型的列使用国家字符集 raw & long raw # 固定/可变长度的二进制数据长度 最2G,可存放多媒体图象声音等.(老类型,逐步淘汰) LONG …

浅谈CSRF跨域读取型漏洞之JSONP劫持

目录 前提知识 CSRF JSONP jsonp漏洞 原理 过程 复现 漏洞挖掘思路 漏洞防御 前提知识 CSRF 提起CSRF&#xff0c;可能很多人都会想到修改个人资料、授权登陆等攻击场景&#xff0c;可以发现这两个场景都是写入型的CSRF漏洞&#xff0c;通常会忽视更常见的读取型的CS…

MP与IP-Trunk技术讲解

目录 PPP MP技术 将PPP链路直接绑定到VT上实现MP 按照PPP链路用户名查找VT实现MP IP-Trunk技术 PPP MP技术 MP&#xff08;MultiLink PPP&#xff09;将多个PPP链路捆绑使用的技术&#xff08;Serial接口、POS接口等&#xff09; 实现方式 可以采用虚拟VT接口实现MP PPP链路…