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 什么是聚簇索引?与非聚簇索引有什么区别?

索引的分类:

  1. 按字段的特性分类可以分为:主键索引、前缀索引、复合索引、普通索引。

  2. 按照数据结构分类:B+tree索引、Hash索引。

  3. 按物理存储分类可以分为:聚簇索引、辅助索引(二级索引)

聚簇索引:聚簇索引并不是一种单独的索引类型,而是一种数据的存储方式。

聚簇:表示数据行和相邻的键值是紧凑地存储一起,索引和数据在一起

聚簇索引的二级索引:叶子节点不会保存引用行的物理位置,而是只保存行的主键值。

聚簇索引:将数据存储和索引放到了一起,索引结构的叶子节点是保存了行数据。

非聚簇索引:将数据和索引分开存储,索引结构的叶子节点存储的是指向数据行对应的地址。

什么是回表?如何解决回表问题?

比如有一个表有id(主键),name(普通索引)

回表指的就是:第一遍先根据辅助索引查询到主键值,再根据主键值在聚簇索引中获取行记录,这就是回表。

使用覆盖索引解决回表问题

定义:如果一个索引包含了所有查询的字段的值,不需要回表,这个索引就是覆盖索引。

优化思路:只需要在一颗索引树上就能获取SQL所需的列数据,无需回表,速度更快。

具体地实现方式

  • 将被频繁查询的字段创建联合索引,这样就可以避免回表,可以直接返回索引中的数据。

什么是索引下推?

select * from users where name like '张%' and age = 10;

上图中没有索引下推,需要回表四次,拿到数据,再进行age字段的比较,过滤掉不符合条件的记录。
引入索引下推之后,可以在索引遍历的过程中,对索引包含的字段先进行判断,过滤掉不符合条件的记录,减少回表。”

引入索引下推之后

在索引内部就判断 age 是否等于10,对于不等于的记录,直接跳过,不进行回表。

总结:如果没有索引下推优化,当进行索引查询时,首先要根据索引来查找记录,然后再根据where条件进行过滤,得到想要的数据。

在支持ICP之后,MySQL在取出索引的同时,判断是否可以进行where条件过滤。再进行索引查询,如果可以就提前进行过滤。可以减少回表次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值