MySQL面试题(二)
4 Hash索引有哪些优缺点?
Hash索引底层是Hash表,根据键值<key, value>存储数据的结构。比较适合根据key查找value值,也就是单个key的查询或者等值查询。
优点
-
因为索引自身只需要存储对应的Hash值,所以索引的结构比较紧凑,如果只需要做等值查询,不包含范围查询,可以选择使用Hash索引
-
在没有Hash冲突的情况下,等值查询访问hash索引的速度比较快,但是如果发生冲突,必须遍历链表中所有的行指针,逐行比较。
缺点
-
Hash索引只包含哈希值和行指针,不存储字段值,所以每次查询都要回表
-
Hash索引只支持等值比较查询。
-
Hash索引无法进行排序。
5 什么是写失效
Linux文件系统页(OS Page)默认大小是4KB,而MySQL的页(Page)默认大小是16KB。
InnoDB的页和操作系统的页的大小不一致,InnoDB的页写入磁盘时就需要分4次来写。
这时候,存在一种情况:
如果存储引擎正在写入的页的数据到磁盘时发生了宕机,这时如果我们只是写了一部分页,比如写4K,就宕机,这种情况就被叫做写失效,可能会导致数据的丢失,并且这种页数据的损坏,靠redoLog是无法恢复的。
6 什么是聚簇索引?与非聚簇索引有什么区别?
索引的分类:
-
按字段的特性分类可以分为:主键索引、前缀索引、复合索引、普通索引。
-
按照数据结构分类:B+tree索引、Hash索引。
-
按物理存储分类可以分为:聚簇索引、辅助索引(二级索引)
聚簇索引:聚簇索引并不是一种单独的索引类型,而是一种数据的存储方式。
聚簇:表示数据行和相邻的键值是紧凑地存储一起,索引和数据在一起
聚簇索引的二级索引:叶子节点不会保存引用行的物理位置,而是只保存行的主键值。
聚簇索引:将数据存储和索引放到了一起,索引结构的叶子节点是保存了行数据。
非聚簇索引:将数据和索引分开存储,索引结构的叶子节点存储的是指向数据行对应的地址。
什么是回表?如何解决回表问题?
比如有一个表有id(主键),name(普通索引)
回表指的就是:第一遍先根据辅助索引查询到主键值,再根据主键值在聚簇索引中获取行记录,这就是回表。
使用覆盖索引解决回表问题
定义:如果一个索引包含了所有查询的字段的值,不需要回表,这个索引就是覆盖索引。
优化思路:只需要在一颗索引树上就能获取SQL所需的列数据,无需回表,速度更快。
具体地实现方式:
- 将被频繁查询的字段创建联合索引,这样就可以避免回表,可以直接返回索引中的数据。
什么是索引下推?
select * from users where name like '张%' and age = 10;
上图中没有索引下推,需要回表四次,拿到数据,再进行age字段的比较,过滤掉不符合条件的记录。
引入索引下推之后,可以在索引遍历的过程中,对索引包含的字段先进行判断,过滤掉不符合条件的记录,减少回表。”
引入索引下推之后
在索引内部就判断 age 是否等于10,对于不等于的记录,直接跳过,不进行回表。
总结:如果没有索引下推优化,当进行索引查询时,首先要根据索引来查找记录,然后再根据where条件进行过滤,得到想要的数据。
在支持ICP之后,MySQL在取出索引的同时,判断是否可以进行where条件过滤。再进行索引查询,如果可以就提前进行过滤。可以减少回表次数。