博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL存储引擎底层常见面试题
阅读量:4169 次
发布时间:2019-05-26

本文共 1380 字,大约阅读时间需要 4 分钟。

更多内容,前往 进行查看

一、聚集索引、非聚集索引到底是什么东西?

       实际上InnoDB的主键索引就可以认为是个聚集索引

       聚集索引具体是什么意思呢?聚集索引也叫做聚簇索引,就是索引和表的数据列聚集在一起,放在一个文件里面去存储。
       实际上MyISAM的主键索引可以认为是非聚集索引
       非聚集索引具体是什么意思呢?非聚集索引也叫稀疏索引,就是索引文件是不包含索引所在行的数据,说白了就是索引和数据分开存放

二、为什么InnoDB必须要有主键?

      因为如果没有主键的话,无法用B+ Tree来组织存储。MySQL设计的InnoDB表数据文件就是如此,必须有B+ Tree来组织存储,所以就需要有个主键来帮忙组织存储data元素

     有热爱提问的小伙伴可能会有疑问,平时在工作中建表也没有指定主键,但是创建成功了。
      虽然没有明确的指定主键,但是MySQL会在InnoDB表里面找一行唯一索引作为主键索引。
      如果在表里面没有找到可以充当唯一索引的数据,会自动创建一个字段:rowid来作为主键,每插入一行就是给这个rowid生成一个整型数值(类似1,2,3,4,5),是由MySQL自主维护的,我们是看不到的
      总的来说,MySQL最终去找InnoDB表的某一行数据,必须要有一个唯一的标识字段来去找数据,MySQL底层设计如此

三、为什么InnoDB推荐使用整型自增主键?

      我们来拿UUID举反例说明,它是字符串且不是自增的(当前目前也是有公司使用UUID来存储主键的,一般是软件公司或者规模不大的公司,互联网公司一般不这么使用)

      从效率上来讲:由于InnoDB底层是B+ Tree,要定位到某个元素就必须从根节点一个层层查找,而在查找的过程中需要进行大量的索引元素大小的比较。大家可以想一下是整型的1 < 2比较速度快还是UUID的字符串“abc”<“123”(字符串可能是任何内容)比较速度快,显然整型比较要快的多,字符串在比较的时候会挨着一个个去比较,而且在比较的还需要先转换成ASII码,按照码表的顺序去比较,性能远远小于整型的比较。
      从占用存储空间上来看:UUID占用的存储空间要远大于整型。由于索引是存储在磁盘上的,它是占用磁盘存储空间的,不是隐形的东西,是实实在在存在的,最终还可能被加载到内存中,我们是希望索引占用的存储空间越小越好,所以也是整型更好一点
      至于为什么要使用自增的?
      如果使用的是整型自增的数据,按照索引B+ Tree的结构,叶子节点从左往右是依次递增的,也就是说,新增加的索引元素一般来说,在最后面追加元素即可。维护节点只是增加后面的新节点。
      如果使用的不是自增的数据,维护的代价比较大。假设有张数据表,现有的数据已经存储到对应的节点中去了,新增一个节点,如果之前的数据每个节点16KB都已存储满了,不能再存储新的元素了,而现在新增的元素刚好是需要插入到某个节点的中间位置(因为需要维护B+ Tree的特性,叶子结点依次递增的关系),节点就会进行分裂甚至还会进行一次平衡.比如,有以下原始数据:
在这里插入图片描述
现在插入4,刚插入如下图:
在这里插入图片描述
节点分裂:
在这里插入图片描述
节点平衡,最终状态:
在这里插入图片描述
所以,总的来说,自增数据,每次都是往后面插入数据,节点分裂和再平衡的情况出现的概率极低,如果不自增的话,时不时要往已经存储满的大节点中插入数据,会大量导致节点分裂和再平衡,效率是非常低的

转载地址:http://foyai.baihongyu.com/

你可能感兴趣的文章
vbs脚本大全,配有实例
查看>>
WIN32汇编基础
查看>>
Win32汇编基础教程
查看>>
“VM6辅助启动.bat”生成器.hta
查看>>
windows脚本调试howto
查看>>
五笔86版字根图程序
查看>>
Oracle EBS R12 - Use Rman to Clone Oracle EBS R12.1.1 without shutting down source Database and MT
查看>>
Oracle EBS - What happening when executing adpreclone.pl in DB and Apps Tier?
查看>>
Oracle EBS - What happening when executing adcfgclone.pl in DB Tier as well as Apps Tier?
查看>>
Oracle EBS - Details of Adpreclone and Adcfgclone
查看>>
两个对Oracle性能影响很大的io参数
查看>>
Win32ASM备忘之搭建UltraEdit实验环境
查看>>
The Best Linux Distribution of them all
查看>>
Oracle Apps DBA Interview Questions
查看>>
简单屏幕锁(Simple Screen Locker) 1.1.6.16
查看>>
Bash String Manipulation Examples – Length, Substring, Find and Replace
查看>>
String Operations in Shell
查看>>
烦请解释一下“驱动表”的概念
查看>>
IPAide(IP助手) v1.01
查看>>
Oracle 11g RAC SCAN basics
查看>>