MySQL 面试题整理

668人浏览 / 0人评论

参考

https://www.bilibili.com/video/BV1ta411C7xq?p=1&vd_source=c3f854044cf23983e6446412aa554ba4

B树和B+树之间的区别是什么?

区别:B树数据在每个节点上,B+树数据在叶子结点上; 

慢SQL优化思路

看执行计划,看是否适合加索引。

索引

索引是帮助MySQL高效获取数据的排好序数据结构

MySQL默认索引结构为B+树,但是也可以用Hash结构。

索引类型

聚集索引(聚簇索引):叶子节点包含了完整的数据记录,即索引与数据位于同一文件。InnoDB是聚集索引。

非聚集索引(非聚簇索引):索引和数据存放在不同的文件。MyISAM是非聚集索引。

联合索引

索引下推:如果要查询的bcd为111,那么当匹配到联合索引树的叶子节点时,直接确定该数据的主键,通过该主键回表查询对应的一条数据,回表一次。(MySQL5.6)而不是根据当前页所有主键去回表查询所有对应的数据进行比较,回表多次。 

联合索引最左前缀原则

假设有(a、b、c)联合索引,则查询条件中必须有a字段,且与条件中的顺序无关,即只能为:a、ab、abc,ba,cba,bca,bac,cab。

如:select * from user where a = 1 and b = 2 and c = 3;

用or也会走索引。

用 a > 1 不走索引。

索引数据结构

二叉树

如果数据有序递增,那么二叉树结构的索引与全表扫描在性能上差别不大,还要增加索引的磁盘空间。

红黑树

即二叉平衡树,当左右子树深度相差较大时,会自动调整。

缺点:当数据量较大时,树的高度可能会很高,整体效率会降低。

优化:多路查找。即增大每个节点的存储空间,存储更多的索引元素,以降低树的高度。这样优化后就是B树。

Hash表

Hash索引在效率上比B+树还要高,它的时间复杂度是常量级的,但是工作中几乎不用它,主要原因是Hash结果不支持范围查询。

B-Tree

B+Tree

MySQL中默认每个节点大小为16KB;

高度为3的B+树能存放几千万的索引元素;

存储引擎

存储引擎形容的是数据库表。

MyISAM存储引擎

黄色部分是索引文件(.MYI),蓝色部分是数据文件(.MYD)。

索引结构采用B+树,但是叶子节点存放的是数据文件的数据地址。 

InnoDB存储引擎索引实现

叶子节点存放的是数据记录。

新建表时如果没有添加主键,MySQL会从现有列中选一个可以建立唯一索引的字段作为主键;如果所有列都不符合,那就新增并维护一个隐藏列:rowid。但是这样会消耗额外的系统资源,所以建议必须建主键。

推荐使用整形的自增主键,是因为其折半查找效率高;

而使用UUID字符串需要比较字符串中的每一位字符,效率低,而且会占用更多空间

对于推荐使用自增主键,是因为这样只会在树的右边增加,不会插入到前面的位置,导致节点内数据逼近最大值而分裂(叶子结点是有序的,由数据库自动维护),额外消耗系统性能。

数据库操作

# 显示user表的索引信息,其中“index_type”一栏显示的是“BTREE”,因为MySQL底层认为B+树只是B树的一个加强版,所以显示的是B树,当然实际上还是B+树
show index from user;

数据页(B+树原理,一页就是B+树的一个节点)

B+树:上面三页是索引页,下面四页是数据页。索引和用户数据存在一起,所以也叫聚簇索引。

 

全部评论