• 索引相关问题


    数据库索引

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

    数据库索引的特点:

    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 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。

    具有动态平衡的特点。
    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。(很简单:索引命中只能是相等的情况,不能是范围匹配)

     转载自:https://cyc2018.github.io/CS-Notes/#/notes/MySQL

  • 相关阅读:
    EBS Form菜单栏增加选项
    Oracle EBS 基础概念:弹性域-上下文字段
    EBS apps, applsys 的关系及密码更改
    设计模式-建造者模式
    微服务入门
    常见SQL编写和优化
    java 8 stream toMap问题
    mysql8.0.22在centos7.6下的简单安装
    mysql8的collate问题和修改
    springboot+security自定义登录-1-基础-自定义用户和登录界面
  • 原文地址:https://www.cnblogs.com/du001011/p/11300648.html
Copyright © 2020-2023  润新知