MySQL 面试题整理
参考
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+树:上面三页是索引页,下面四页是数据页。索引和用户数据存在一起,所以也叫聚簇索引。
全部评论