Mysql高频面试题(一)

news2024/11/25 3:04:50

文章目录

  • 1. Mysql如何实现的索引机制?
  • 2. InnoDB索引与MyISAM索引实现的区别是什么?
  • 3. 一个表中如果没有创建索引,那么还会创建B+树吗?
  • 4. B+树索引实现原理(数据结构)
  • 5. 聚簇索引与非聚簇索引的B+树实现有什么区别?
  • 6. B+树中聚簇索引的查找(匹配)逻辑
  • 7. B+树中非聚簇索引的查找(匹配)逻辑

建立索引的目的是加快对表中记录的查找或排序。
付出的代价:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

1. Mysql如何实现的索引机制?

MySQL中索引分三类:B+树索引、Hash索引、全文索引

2. InnoDB索引与MyISAM索引实现的区别是什么?

MyISM索引文件和数据文件是分离的,使用B+树实现,主键索引与辅助索引实现一致,索引文件仅保存记录所在行的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。

在这里插入图片描述

  1. InnoDB的数据文件本身就是索引文件,而MyISAM索引文件和数据文件是分离的 ,索引文件仅保存数据记录的地址。
  • MyISAM的表在磁盘上存储在以下文件中: *.sdi(描述表结构)*.MYD(数据)*.MYI(索引)
    在这里插入图片描述
  • InnoDB的表在磁盘上存储在以下文件中: .ibd(表结构、索引和数据都存在一起)
    在这里插入图片描述
  1. InnoDB的的二级索引的叶子节点存放的是Key字段加主键值。因此,通过二级索引查询首先查到的是主键值,然后InnoDB再根据查到的主键值通过主键索引找到相应的数据块。MyISAM的索引方式都是非聚簇的。MyISAM索引记录的是地址 。
    在这里插入图片描述

3. 一个表中如果没有创建索引,那么还会创建B+树吗?

会创建B+树。
InnoDB要求表必须有主键 ( MyISAM可以没有 )。如果没有显式指定,则MySQL系统会自动选择一个可以非空且唯一标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

  • 如果有主键会创建聚簇索引
  • 如果没有主键会生成rowid作为隐式主键

4. B+树索引实现原理(数据结构)

假设有一个表index_demo,表中有2INT类型的列,1CHAR(1)类型的列,c1列为主键:
CREATE TABLE index_demo(c1 INT, c2 INT, c3 CHAR(1), PRIMARY KEY(c1)) ;

index_demo表的简化的行格式示意图如下:
在这里插入图片描述
我们只在示意图里展示记录的这几个部分:

  • record_type:表示记录的类型, 0是普通记录、 2是最小记录、 3 是最大记录、1是B+树非叶子节点记录。
  • next_record:表示下一条记录的相对位置,我们用箭头来表明下一条记录。
  • 各个列的值:这里只记录在 index_demo 表中的三个列,分别是 c1 、 c2 和 c3 。
  • 其他信息:除了上述3种信息以外的所有信息,包括其他隐藏列的值以及记录的额外信息。

其他信息项暂时去掉并把它竖起来的效果就是这样:
在这里插入图片描述
把一些记录放到页里的示意图就是(这里一页就是一个磁盘块,代表一次IO):
在这里插入图片描述

MySQL InnoDB的默认的页大小是16KB,因此数据存储在磁盘中,可能会占用多个数据页。如果各个页中的记录没有规律,我们就不得不依次遍历所有的数据页。如果我们想快速的定位到需要查找的记录在哪些数据页中,我们可以这样做 :

  • 下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值
  • 给所有的页建立目录项
    在这里插入图片描述
    页28为例,它对应目录项2 ,这个目录项中包含着该页的页号28以及该页中用户记录的最小主键值 5
    我们只需要把几个目录项在物理存储器上连续存储(比如:数组),就可以实现根据主键值快速查找某条记录的功能了。比如:查找主键值为 20 的记录,具体查找过程分两步:
  1. 先从目录项中根据二分法快速确定出主键值为20的记录在目录项3中(因为 12 ≤ 20 < 209 ),对应页9
  2. 再到页9中根据二分法快速定位到主键值为 20 的用户记录。
    至此,针对数据页做的简易目录就搞定了。这个目录有一个别名,称为索引

InnoDB中的索引方案:
我们新分配一个编号为30的页来专门存储目录项记录,页10、28、9、20专门存储用户记录
在这里插入图片描述
目录项记录普通的用户记录的不同点:

  • 目录项记录 的 record_type 值是1,而 普通用户记录 的 record_type 值是0。
  • 目录项记录只有主键值和页的编号两个列,而普通的用户记录的列是用户自己定义的,包含很多列,另外还有InnoDB自己添加的隐藏列。
    现在查找主键值为 20 的记录,具体查找过程分两步:
  1. 先到页30中通过二分法快速定位到对应目录项,因为 12 ≤ 20 < 209 ,就是页9。
  2. 再到页9中根据二分法快速定位到主键值为 20 的用户记录。

更复杂的情况如下:
我们生成了一个存储更高级目录项的 页33 ,这个页中的两条记录分别代表页30页32,如果用户记录的主键值在 [1, 320) 之间,则到页30中查找更详细的目录项记录,如果主键值 不小于320 的话,就到页32中查找更详细的目录项记录。这个数据结构,它的名称是 B+树 。
在这里插入图片描述

5. 聚簇索引与非聚簇索引的B+树实现有什么区别?

  • 聚簇索引

定义聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。
特点

  • 索引和数据保存在同一个B+树中
  • 页内的记录是按照主键的大小顺序排成一个单向链表
  • 页和页之间也是根据页中记录的主键的大小顺序排成一个双向链表
  • 非叶子节点存储的是记录的主键+页号
  • 叶子节点存储的是完整的用户记录
    在这里插入图片描述

优点:

  • 数据访问更快 ,因为索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。
  • 聚簇索引对于主键的排序查找范围查找速度非常快。
  • 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库可以从更少的数据块中提取数据,节省了大量的IO操作
  • 在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、>、>=)或使用group by或order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。
    可以作为聚簇索引的候选列
    1、主键列,该列在where子句中使用并且插入是随机的。
    2、按范围存取的列,如pri_order > 100 and pri_order < 200。
    3、在group by或order by中使用的列。
    4、不经常修改的列。
    5、在连接操作中使用的列。

缺点:

  • 插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
  • 更新主键的代价很高 ,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新

限制:

  • 只有InnoDB引擎支持聚簇索引,MyISAM不支持聚簇索引
  • 由于数据的物理存储排序方式只能有一种,所以每个MySQL的表只能有一个聚簇索引
  • 如果没有为表定义主键,InnoDB会选择非空的唯一索引列代替。如果没有这样的列,InnoDB会隐式的定义一个主键作为聚簇索引。
  • 为了充分利用聚簇索引的聚簇特性,InnoDB中表的主键应选择有序的id,不建议使用无序的id,比如UUID、MD5、HASH、字符串作为主键,无法保证数据的顺序增长。
  • 非聚簇索引(二级索引、辅助索引)

聚簇索引,只能在搜索条件是主键值时才发挥作用,因为B+树中的数据都是按照主键进行排序的,如果我们想以别的列作为搜索条件,那么需要创建非聚簇索引
定义非聚簇索引,叶级页指向表中的记录,记录的物理顺序与逻辑顺序没有必然的联系。非聚簇索引则更像书的标准索引表,索引表中的顺序通常与实际的页码顺序是不一致的。
特点:一个表可以多个非聚簇索引。
非聚簇索引常被用在以下情况
1、某列常用于集合函数(如Sum,…)。
2、某列常用于join,order by,group by。
3、查寻出的数据不超过表中数据量的20%。

例如,以c2列作为搜索条件,那么需要使用c2列创建一棵B+树,如下所示:
在这里插入图片描述
非聚簇索引的B+树与聚簇索引的B+树有几处不同:

  • 页内的记录是按照从c2列的大小顺序排成一个单向链表
  • 页和页之间也是根据页中记录的c2列的大小顺序排成一个双向链表
  • 非叶子节点存储的是记录的c2列+页号
  • 叶子节点存储的并不是完整的用户记录,而只是c2列+主键这两个列的值。

6. B+树中聚簇索引的查找(匹配)逻辑

例如:根据主键c1列的值查找c1=100的记录,查找过程如下:

  1. 根据根页面33定位到页30(因为1 ≤ 100 < 320
  2. 同理最终在页9定位到具体的记录。
  3. 由于聚簇索引的叶子节点存储的是完整的用户记录,所以B+树中聚簇索引能直接查找到完整的用户记录
    在这里插入图片描述

7. B+树中非聚簇索引的查找(匹配)逻辑

例如:根据c2列的值查找c2=4的记录,查找过程如下:

  1. 根据根页面44定位到页42(因为2 ≤ 4 < 9
  2. 由于c2列没有唯一性约束,所以c2=4的记录可能分布在多个数据页中,又因为 2 ≤ 4 ≤ 4,所以确定实际存储用户记录的页在页34和页35中。
  3. 页34页35定位到具体的记录
  4. 但是这个B+树的叶子节点只存储了c2和c1(主键)两个列,所以我们必须再根据主键值去聚簇索引中再查找一遍完整的用户记录。
    在这里插入图片描述

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

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

相关文章

Vector源码分析

Vector源码分析 1 Vector基本介绍与类图 Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的: Vector 是同步访问的。Vector 包含了许多传统的方法,这些方法不属于集合框架。Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的…

pytest + yaml 框架 - 1.我们发布上线了!

前言 基于 httprunner 框架的用例结构&#xff0c;我自己开发了一个pytest yaml 的框架&#xff0c;那么是不是重复造轮子呢&#xff1f; 不可否认 httprunner 框架设计非常优秀&#xff0c;但是也有缺点&#xff0c;httprunner3.x的版本虽然也是基于pytest框架设计&#xff…

Spring中JDK与Cglib动态代理的区别

靠Spring吃饭的小伙伴一定经常听说动态代理这个词&#xff0c;没错&#xff0c;Aop就是靠它来实现的。Spring提供了两种代理模式&#xff1a;JDK动态代理、Cglib动态代理&#xff0c;供我们选择&#xff0c;那他们有啥区别呢&#xff1f;Sping为啥不自己从中挑选一个作为代理模…

IB物理的费曼图怎么考?

费曼图是用来描述基本粒子间相互作用的图形化表示&#xff0c;由诺贝尔物理学奖得主、著名物理学家理查德费曼&#xff08;Richard Feynman&#xff09;提出&#xff0c;十分清晰直观。虽然真正的费曼图可以用来做更深奥的数学计算&#xff0c;但是在IB物理中&#xff0c;考纲要…

那些惊艳一时的 CSS 属性

1.position: sticky 不知道大家平时业务开发中有没有碰到像上图一样的吸顶的需求&#xff1a;标题在滚动的时候&#xff0c;会一直贴着最顶上。 这种场景实际上很多&#xff1a;比如表格的标题栏、网站的导航栏、手机通讯录的人名首字母标题等等。如果让大家自己动手做的话&…

flink学习

Flink学习之路&#xff08;一&#xff09;Flink简介 - 走看看 Flink(一)-基本概念 - 知乎 Flink架构&#xff1a; Flink整个系统包含三个部分&#xff1a; 1、Client&#xff1a; 给用户提供向Flink系统提交用户任务&#xff08;流式作业&#xff09;的能力。用户提交一个F…

大型商场借力泛微,实现内外协同招商,合同、铺位、费用统一管理

对即将开业或是面临调整改造的购物中心来说&#xff0c;用什么样的方式才能快速地达成招商目的&#xff0c;实现资产价值的保值和增值&#xff0c;成为商业操盘手们共同面临的难题…… 行业需求 • 建立充足的品牌资源储备&#xff0c;拓宽招商渠道和线索&#xff0c;提高成交…

ElasticSearch-全文检索和分析引擎学习Day01

前言 学习谷粒商城基础片完结后便开启了高级部分的学习&#xff0c;高级部分的第一章节 Elasticsearch 搜索和分析引擎。文档地址&#xff1a;elasticsearch中文文档地址 一、Elasticsearch 简介 1.1 Elasticsearch 是什么&#xff1f; Elasticsearch 是一个分布式的免费开…

入门力扣自学笔记208 C++ (题目编号:895)

895. 最大频率栈​​​​​​ 题目&#xff1a; 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除…

Leetcode 85.最大矩形(困难)

一、题目 1、题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0&qu…

基于微信小程序奶茶店在线点单管理系统ssm框架-计算机毕业设计

面对目前奶茶店林立的现状&#xff0c;大城市奶茶店多为连锁奶茶店他们都有统一的管理和相应的系统。但是个别小县城和小城以及城区也有不少的奶茶店多为自营&#xff0c;这就必须店长自己管理和采购原料。大型连锁的奶茶店管理系统就不适用于分散的小型奶茶店。小型奶茶店的管…

剑指 Offer 10- II. 青蛙跳台阶问题

一、题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。 二、示例 示…

TaWRKY19/61/82激活糖转运蛋白TaSTP3从而增强小麦条锈病敏感性

文章信息 题目&#xff1a;Sugar transporter TaSTP3 activation by TaWRKY19/61/82 enhances stripe rust susceptibility in wheat 刊名&#xff1a;New Phytologist 作者&#xff1a;Baoyu Huai&#xff0c;Zhensheng Kang,Jie Liu et al. 单位&#xff1a;Northwest A&…

【C++】string使用模拟实现

文章目录前言为什么学习string类&#xff1f;1. string函数常用接口介绍1.1 string容器基本概念1.2 string构造函数1.3 string访问和修改1.4 string插入和删除1.5 string赋值操作1.5 string字符串拼接1.7 string查找和替换1.8 string子串1.9 string类对象的容量操作2. string类…

dockerfile编写

dockerfile编写 dcoker 的一个操作和交互的关系流程: dockerfile 编写规则 习惯使用大写非注释行第一行必须是FROM文件名必须是dockerfile指定一个专门的工作目录所有引入的映射文件必须在这个工作空间目录下工作空间不支持隐藏文件(.dockeringore)作用是用于存放不需要打包…

2022最新iOS最新打包发布流程

关于如何发布iOS应用到App Stroe&#xff0c;苹果开发者中心已经给出了很详细的说明。和普通的iOS应用一样&#xff0c;使用React Native开发的iOS应用也需要使用普通的iOS应用的发布流程&#xff0c;总的来说&#xff0c;主要涉及以下几步&#xff1a; 加入苹果开发者计划&am…

【Android进阶之旅】内存泄漏的危害有哪些?(案例分析)

随着计算机应用需求的日益增加&#xff0c;应用程序的设计与开发也相应的日趋复杂&#xff1b; 开发人员在程序实现的过程中处理的变量也大量增加&#xff0c;如何有效进行内存分配和释放&#xff0c;防止内存泄漏的问题变得越来越突出 例如&#xff1a; 服务器应用软件&#x…

connection is being used##server is in use and cannot be deleted

mysql数据库被黑客挟持&#xff0c;删除我的数据库&#xff0c;让我用比特币来换&#xff0c;吓死我了&#xff0c;还好是测试库&#xff0c;删了就删了&#xff0c;数据库备份还得做好&#xff0c;密码不能设置太简单了。 下面是黑客留言&#xff1a; "以下数据库已被删…

64-65 - C++中的异常处理

---- 整理自狄泰软件唐佐林老师课程 1. C异常处理 1.1 try catch内容一 C内置了异常处理的语法元素 try catchtry语句用于处理正常代码逻辑catch语句用于处理异常情况 try语句中的异常由对应的catch语句处理 1.2 C通过throw语句抛出异常信息 1.3 C异常处理分析 throw抛出的…

【SSM注解汇总】

SSM注解汇总 文章目录SSM注解汇总MyBatis注解1. param("param1","param2",...)2. MapKey("id")Spring注解1. IOC Component Service Controller Repository2. 基于注解方式实现属性注入1&#xff09;Autowired2&#xff09;Qualifier3&#xff0…