索引相关问题

数据库索引

数据库索引是用于提高数据库表的数据访问速度的。

数据库索引的特点:

a)避免进行数据库全表的扫描,大多数情况,只需要扫描较少的索引页和数据页,而不是查询所有数据页。而且对于非聚集索引,有时不需要访问数据页即可得到数据。

b)聚集索引可以避免数据插入操作,集中于表的最后一个数据页面。

c)在某些情况下,索引可以避免排序操作。

下面从这几个方面展开索引

  • 使用索引为什么可以加快数据库的检索速度啊?

  • 为什么说索引会降低插入、删除、修改等维护任务的速度。

  • Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗?

  • 聚集索引和非聚集索引有什么区别?

  • 索引的最左匹配原则指的是什么?

1.1使用索引为什么可以加快数据库的检索速度啊?

将无序的数据变成相对有序的数据(就像查目录一样)

1.2  为什么说索引会降低插入、删除、修改等维护任务的速度。

由于MySQL在存储索引的时候,底层用的数据结构是B+树,B+树是一颗平衡树,如果我们对这颗树增删改的话,那肯定会破坏它的原有结构。要维持平衡树,就必须做额外的工作。正因为这些额外的工作开销,导致索引会降低增删改的速度

1.3Hash索引和B+树索引有什么区别?

B+树索引:

是大多数 MySQL 存储引擎的默认索引类型。

因为不再需要进行全表扫描,只需要对树进行搜索即可,所以查找速度快很多。

因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组。

可以指定多个列作为索引列,多个索引列共同组成键。

适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。如果不是按照索引列的顺序进行查找,则无法使用索引。

InnoDB 的 B+Tree 索引分为主索引和辅助索引。主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。

 

辅助索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。

扫描二维码关注公众号,回复: 6950541 查看本文章

具有动态平衡的特点。
1.支持范围查询。
2.等长的访问路径,访问时间根据数据量的变化相对稳定。
3.有明确的查找方向。

Hash索引:

哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。本质上就是把键值换算成新的哈希值,根据这个哈希值来定位。

具有查找速度快的特点。
1.仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。 

2.哈希索引也没办法利用索引完成排序

3.不支持最左匹配原则

4.在有大量重复键值情况下,哈希索引的效率也是极低的---->哈希碰撞问题。

主流的还是使用B+树索引比较多,对于哈希索引,InnoDB是自适应哈希索引的(hash索引的创建由InnoDB存储引擎引擎自动优化创建,我们干预不了)!

1.4聚集和非聚集索引

简单概括:

  • 聚集索引就是以主键创建的索引
  • 非聚集索引就是以非主键创建的索引

区别:

  • 聚集索引在叶子节点存储的是表中的数据
  • 非聚集索引在叶子节点存储的是主键和索引列
  • 使用非聚集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。(拿到主键再查找这个过程叫做回表)

非聚集索引也叫做二级索引,不用纠结那么多名词,将其等价就行了~

非聚集索引在建立的时候也未必是单列的,可以多个列来创建索引。

  • 此时就涉及到了哪个列会走索引,哪个列不走索引的问题了(最左匹配原则-->后面有说)
  • 创建多个单列(非聚集)索引的时候,会生成多个索引树(所以过多创建索引会占用磁盘空间)

1.5索引最左匹配原则

最左匹配原则

  • 索引可以简单如一个列(a),也可以复杂如多个列(a, b),即联合索引
  • 如果是联合索引,那么key也由多个列组成,同时,索引只能用于查找key是否存在(相等),遇到范围查询(>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找。
  • 因此,列的排列顺序决定了可命中索引的列数

例子:

  • 如有索引(a, b,c),查询条件a = 1 and b > 4 and c > 8,则会在每个节点依次命中a、b,无法命中c。(很简单:索引命中只能是相等的情况,不能是范围匹配)

猜你喜欢

转载自www.cnblogs.com/du001011/p/11300648.html