大厂面试---Redis面试题(含答案,相关知识点,面试考察次数统计)_安吉_lh1029的博客-CSDN博客
大厂面试问答题汇总分析---数据库(索引-聚集/非聚集,事务,mySql, 锁)_安吉_lh1029的博客-CSDN博客
大厂面试问答题汇总分析---网络安全类问题_安吉_lh1029的博客-CSDN博客
大厂面试问答题汇总分析--- 秒杀 / 限流 / 高并发_安吉_lh1029的博客-CSDN博客
【锁】的相关概念汇总_安吉_lh1029的博客-CSDN博客
大厂面试问答题汇总分析--- 多线程问题_安吉_lh1029的博客-CSDN博客
概目录
1-2、mysql为什么使用B+树?与B树的比较,为什么使用B+树不用B树?
1-3、其他数据结构(二叉查找树,平衡二叉树,红黑树,hash)的区别?其他数据结构不选用索引的原因
1-4、聚集索引 VS 非聚集索引 的区别?MyisAM和innodb引擎相关问题
2-2-4、Myql中的事务回滚机制,持久性,隔离级别的实现
【数据库】相关面试题及知识点答案
【超高频】一、索引相关问题
1-1、mysql索引数据结构?
索引结构:排好序的快速查找数据结构。索引会影响where后面的查找,和order by 后面的排序。
B+Tree索引(平衡多路查找树):数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。
1-2、mysql为什么使用B+树?与B树的比较,为什么使用B+树不用B树?
1】B+树【访问磁盘IO次数少】的特点:非叶子节点上是不存储数据的,仅存储键值 |B树区别:每个节点存储了 键值 和 数据,因此B+树更矮,磁盘IO次数少
2】B+树【更适合范围查询】的特点:所有数据均存储在叶子节点,而且数据是按照顺序排列的,只要遍历叶子节点就可实现整棵树的遍历,且数据库中基于【范围的查询】是非常频繁的 | B树区别: 【中序遍历】所有节点,效率太低
3】B+树 各页之间通过双向链表连接,叶节点是通过单向链表连接
1-3、其他数据结构(二叉查找树,平衡二叉树,红黑树,hash)的区别?其他数据结构不选用索引的原因
其他数据结构 | 结构特点 | 不选用索引的原因 |
二叉查找树 | 左子节点<当前键值<右子节点 | 树的高度不均匀,不能自平衡,存在极端情况 |
平衡二叉树 | AVL树, 树的构造是平衡的 ,左右子树高度差的绝对值不超过1 | 每个节点只存储一个键值和数据,需要多次磁盘IO,查找数据效率极低 |
红黑树 | 1、每个节点,不是黑色,就是红色 2、根节点是黑色的 3、每个叶子节点都是黑色的 4、如果一个节点是红色的,那么它的叶子节点是黑色的 5、从一个节点到该节点的子孙节点的所有路径上都包含相同数量的黑色节点 |
树的高度随着数据量增加而增加,IO代价高。 |
hash索引 | 键值对 key :value (键 :值) | 虽然可以快速定位,但是没有顺序,IO复杂度高 |
1-4、聚集索引 VS 非聚集索引 的区别?MyisAM和innodb引擎相关问题
非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据(回表过程)。
MyISAM( 非聚集)
B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
InnoDB( 聚集索引)
1、第一个重大区别是InnoDB的数据文件本身就是索引文件, 这棵树的叶节点data域保存了完整的数据记录。
但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
2、InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有)
1)如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键
2)如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。(隐含字段)
简单说:
如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引;如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;
innodb引擎的4大特性
插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)
1-5、MyisAM和innodb引擎的区别是什么?
可以查看 两个索引的区别点:MyISAM与InnoDB 的区别(9个不同点)_Chackca的博客-CSDN博客_innodb和myisam的区别
1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件);
5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了
6. MyISAM表格可以被压缩后进行查询操作
7. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
8、InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有
9、Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
Innodb:frm是表定义文件,ibd是数据文件
Myisam:frm是表定义文件,myd是数据文件,myi是索引文件
如何选择:
1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。
3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;
4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。