所有内容收录在合集~MySQL入门到熟练。欢迎点赞关注我哦~
前面的都是一些基础,面试的时候会惊恐的发现,什么鬼啊,好多题我都不会,接下来主要写一些面试题。
面试的时候,关于MySQL主要有5大部分
索引部分,内部技术架构,事务,日志和开发。
关于索引的面试题
MySQL如何实现索引机制?
三种方式:B+树索引,Hash索引,全文索引。
InnoDB索引与MyISAM索引实现的相同点是什么?区别是什么?
解析:MyISAM索引文件和数据文件是分离的,用B+树进行实现,主键索引和辅助索引实现一致,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。
InnoDB索引存储时,和数据放在同一个文件里,数据放在文件里,索引直接在文件里面追加。索引的B+树,最下面,叶子节点存储的具体会指向的数据,InnoDB指向的是id,MyISAM指向的是指针,
答案:共同点:都用的B+树
区别:InnoDB的辅助索引data域存储相应记录的主键的值而不是地址。
InnoDB的数据文件本身就是主索引文件
MyISAM的索引和数据是分开存储的
一个表中如果没有创建索引,还会创建B+树吗?
都会创建。
如果有主键,就会创建聚簇索引,B+树就生成了。
没有主键,也会创建,比如聚簇索引,生成隐式的rowid,和主键一样,不会和其他行重复,合理存储数据,每个数据指定落地的位置,相当于有一个不是主键,但功能类似主键的存在。只供MySQL内部使用。
B+树的相关(索引的实现原理数据结构)
一个页有16k大小,每个页都是。
B树在每个页中既要他的主键/索引的值,又要存储具体这行的数据,还要把数据存储在每个页中。B+树只存储主键/索引的值,没有具体的数据,而是在最页里面存储了一行当中其他的值。
认识一下页
record_type 表示记录的类型,0是普通记录,2是最小记录,3是最大记录,1是B+树非叶子节点记录。
再认识一下B+树
每个叶的最大值和最小值,对应的是下一个页的地址,同时也记录了上一个叶的地址。一般在磁盘上是物理连接的。基础的优化可以放置到独立的磁盘上。
next_record,表示下一条记录的相应位置,用箭头表示下一条记录。
聚簇索引和非聚簇索引的B+树有什么区别?
解析:主键作为索引的值就是聚簇索引,只有一个。
索引和数据在同一个B+树中,页内的记录是按照主键的大小顺序排成一个单向链表,页和业之间也会根据页中记录的主键大小顺序排成一个双向链表,非叶子节点存储的是记录的主键+页号,叶子节点存储的是完整的用户记录。(一页存满了进入下一页)
优点:速度快,对于主键的排序和范围查找非常快,节省IO操作。
缺点:插入的时候严重依赖顺序,更新主键代价高。
限制:inno支持,MyISAM不支持。
由于数据的物理存储方式只有一种,所以每个MySQL只有一个聚簇索引。
如果没有定义主键,会选择非空的唯一主键代替,最好设计时,有自增的,不重复的id,不使用无序的,如gkitggkh,字符串做主键
其他的不论是二级索引,联合索引,复合索引都是非聚簇索引。
比如按名字查找等。
非聚簇索引查找的值需要在到底之后,只能得到一个id,再去聚簇索引,通过主键id拿出具体数据,
聚簇索引定位后,包含的一列的值可以直接读出来
页内记录按照某列排序成单向链表,页和页之间也是页中记录的某列,大小顺序排成双向链表。非叶子节点存储的是x列+页号,叶子节点存储的不是完整的用户记录,而是X列+主键的两个列的值
答案:
聚簇索引每页是按照主键排序的,非聚簇索引是按引哪一列为索引列排序的,也就是按照自己的内容创建了一个属于自己的B+树。
页内记录按照某列排序成单向链表,页和页之间也是页中记录的某列,大小顺序排成双向链表。非叶子节点存储的是x列+页号,叶子节点存储的不是完整的用户记录,而是X列+主键的两个列的值
说一下B+树中的聚簇索引的查找(匹配)逻辑
假设id为999
从根节点做匹配,匹配的就是主键,那么主键999和当前根节点包含的2个主键进行匹配,存储的数据量越多,树的结构也就越矮。之后不断进行匹配,得出结果。
(假设只有一个id,那就是存粹的平衡二叉树,数据量变大就会非常高,降低高度的话,在页中存储更多的数据。变矮可以减少自旋。)
说一下B+树中的非聚簇索引的查找(匹配)逻辑
由于查找方式不同,可能会在很多行中。比如性别,年龄等。
可以通过增加约束进行查找,或者通过文本创建索引。或者联合索引等吗,转换为ASCII码,或具体的数字进行比对。联合索引遵循最左匹配原则,同时注意like可能会出现的匹配场景和影响。
平衡二叉树,红黑树,B树和B+树的区别是什么,都有哪些应用场景?
二叉树分平衡二叉树和普通二叉树
这个时候需要平衡二叉树,AVL树,可以保证查询效率较高。
特点:
是一棵空树,或者左右两个子树的高度差绝对值不超过1
左右两个子树都是一颗平衡二叉树
缺点:节点只能存一份数据,树会变高,发生自旋的操作,导致只适合存储少量数据
应用广泛一些,两次旋转就可以达到平衡。旋转区域小
一个B+树中能存放多少条索引记录?
假设3层,从根节点来看,可以存16k,主键+指针,可以有16k个叶子节点,再下一层,每个叶子节点,也可以存16k,在第三层,假设一行占1k,也有16行,那就是16X16000X16000
使用B+树存储的索引的crud的执行效率如何?
C CREATE 添加
一般在树的末尾增加一条记录,三层基本没影响,数据量很大,4层可能自旋
R READ 读取
U UPDATE 如果不改id,一般不会数据移动
D DELETE 有可能会移动
O(lognN),以2为底数,N树的高度
什么是自适应哈希索引?
MySQL内部提供的一套额外的索引机制,没办法手动干预创建
什么是2-3树2-3-4树?
多叉树的一种,
2-3树具有如下特点:
2-3树的所有叶子节点都在同一层,
有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点
有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点
2-3,树是中二节点和三节点构成的树
页面更新:2024-03-04
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号