MySQL——(四)聚簇索引和非聚簇索引有什么区别?

聚簇索引和非聚簇索引有什么区别?

总览
聚簇索引与非聚簇索引是从文件存储的角度进行划分:

  1. 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据(InnoDB)
  2. 非聚簇索引:将数据和索引进行分开存储(MyISAM)

一、聚簇索引

  • 一个表仅有一个聚簇索引,默认是主键

  • 聚簇索引性能最好而且具有唯一性,所以非常珍贵,必须慎重设置。一般要根据这个表最常用的SQL查询方式来进行选择,某个字段作为聚簇索引,或组合聚簇索引,这个要看实际情况。
    在这里插入图片描述
    二级索引(辅助索引)

  • 聚簇索引的叶子节点存储了一行完整的数据,而二级索引则存储对应的主键值,相比于聚簇索引,占用的空间要少

  • 当我们需要为表建立多个索引时,如果是聚簇索引,那件占用大量的内存空间,索引InnoDB中主键所建立的是聚簇索引,而唯一索引、普通索引、前缀索引等都是二级索引

  • 若对Name列进行条件搜索,则需要两个步骤:
    (1)在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键

    (2)使用找到的主键,在主索引B+树中再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据

特点:

(1)主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了

(2)表假如使用UUID作为主键,会使数据存储稀疏,这将会出现聚簇索引有可能有比全表扫描更慢

(3)由于索引树是独立的,通过辅助键检索无需访问主键的索引树


二、索引使用规则

  • 单列索引
  • 联合索引

单列索引

SELECT uid FROM people WHERE name = ‘zhangsan’ AND gender = 'M'
  1. 对name列建立索引,这样就把范围限制在name=‘zhangsna’ 的结果集上

  2. 之后再对这个结果集进行扫描,寻址满足gender= ‘M’ 得到最终结果

  3. 在MySQL中执行查询时,只能使用一个索引

  4. 如果在name、gender上分布建立索引,执行查询时,MySQL会自动选择最严格也就是获得结果集记录最少的索引

联合索引

  • 建立一个联合索引(a、b、c),实际上相当于建立了(a)、(a、b)、(a、b、c)三个索引

  • 在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边

  • B+树是按照从左到右的顺序来建立,当(a、b、c)这样的数据来检索的时候:

    (1)比较a来确定下一步的搜索方向

    (2)如果a相同再依次比较b

    (3)如果b相同再比较c,最后得到检索的数据


三、最左匹配原则

【1】当使用(b、c)但是没有a进行查找时,B+树不知道首先检查哪个节点,因为通过(a、b、c)建立的B+树第一个比较因子永远是a,所以必须要先根据a来搜索才能知道下一步去哪里查询

【2】当使用(a、c)来查找时,B+树首先根据a来查找,当下一个字段b缺失,所以只能把符合a的数据都找到,然后再从得到的结果集里面扫描,得到能够匹配字段c的数据,也就意味着(a、c)会使用联合索引,当只有a字段才生效


版权声明:本文为weixin_47163086原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。