聚簇索引和非聚簇索引有什么区别?
总览
聚簇索引与非聚簇索引是从文件存储的角度进行划分:
- 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据(InnoDB)
- 非聚簇索引:将数据和索引进行分开存储(MyISAM)
一、聚簇索引
一个表仅有一个聚簇索引,默认是主键
聚簇索引性能最好而且具有唯一性,所以非常珍贵,必须慎重设置。一般要根据这个表最常用的SQL查询方式来进行选择,某个字段作为聚簇索引,或组合聚簇索引,这个要看实际情况。
二级索引(辅助索引)聚簇索引的叶子节点存储了一行完整的数据,而二级索引则存储对应的主键值,相比于聚簇索引,占用的空间要少
当我们需要为表建立多个索引时,如果是聚簇索引,那件占用大量的内存空间,索引InnoDB中主键所建立的是聚簇索引,而唯一索引、普通索引、前缀索引等都是二级索引
若对Name列进行条件搜索,则需要两个步骤:
(1)在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键(2)使用找到的主键,在主索引B+树中再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据
特点:
(1)主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了
(2)表假如使用UUID作为主键,会使数据存储稀疏,这将会出现聚簇索引有可能有比全表扫描更慢
(3)由于索引树是独立的,通过辅助键检索无需访问主键的索引树
二、索引使用规则
- 单列索引
- 联合索引
单列索引
SELECT uid FROM people WHERE name = ‘zhangsan’ AND gender = 'M'
对name列建立索引,这样就把范围限制在name=‘zhangsna’ 的结果集上
之后再对这个结果集进行扫描,寻址满足gender= ‘M’ 得到最终结果
在MySQL中执行查询时,只能使用一个索引
如果在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字段才生效