关于Mysql索引的N问N答

问:什么是索引?

答:索引是一种数据结构,能帮我们快速的检索数据库中的数据。

问:Mysql的索引采用的是哪种数据结构?

答:常见的Mysql索引主要有两种结构:Hash索引和B+Tree索引。在InnoDB中,默认使用的是B+Tree结构的索引。

问:为什么采用B+Tree结构的索引?它与Hash索引相比有啥优缺点?

答:因为Hash索引底层是用哈希表实现的,多个数据在存储上完全没有任何顺序性。对于区间查询来说,这种结构的索引无法适用,只能进行全表扫描。而B+Tree索引底层是一种多路平衡查询树,它的节点天然有序,对于范围查询也可适用。其次,Hash索引不支持多列联合索引的最左匹配原则,如果存在大量重复键值的情况下,由于哈希碰撞。哈希索引的效率很低。

问:B+Tree的叶子节点可以存什么东西?

答:可能存储的是整行数据,也可能存储的是这行数据的主键值。

问:B+Tree的叶子节点可能存着不同的数据,他们有什么区别?

答:在InnoDB中,B+Tree的叶子节点存储了整行数据的是主键索引,也称为聚蔟索引。而存储主键值的是非主键索引,也称为非聚蔟索引。聚簇索引比非聚簇索引查询更快,因为聚簇索引的叶子节点可以直接返回整行数据,而非聚簇索引只能返回这行数据的主键,还需要在通过主键再进行一次回表查询。

问:非主键索引一定会查询多次吗?

答:通过覆盖索引也可以只查询一次。如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。

问:解释一下联合索引和最左前缀匹配原则。

答:MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引。最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

问:解释一下索引下推。

答:“索引条件下推”,称为 Index Condition Pushdown (ICP),这是MySQL提供的用某一个索引对一个特定的表从表中获取元组”,注意我们这里特意强调了“一个”,这是因为这样的索引优化不是用于多表连接而是用于单表扫描,确切地说,是单表利用索引进行扫描以获取数据的一种方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值