聚集(clustered)索引,也叫聚簇索引。
- 定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
- 注:第一列的地址表示该行数据在磁盘中的物理地址,
- 后面三列才是我们SQL里面用的表里的列,其中id是主键,建立了聚集索引。
创建聚集索引
- 如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引。
- 注意:SQL Sever默认主键为聚集索引,也可以指定为非聚集索引,
- 而MySQL里主键就是聚集索引
非聚集索引
- 定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,
- 一个表中可以拥有多个非聚集索引。
- 除了聚集索引以外的索引都是非聚集索引,
- 只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引
- 非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致
-
非聚集索引的二次查询问题
- 非聚集索引叶节点仍然是索引节点,
- 只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,
- 而查询列中包含了其他该索引没有覆盖的列,
- 那么他还要进行第二次的查询,查询节点上对应的数据行的数据。(回表)
- 如果在数据量不大的情况下,
- SQL Server很有可能不会使用非聚集索引进行查询,
- 而是使用聚集索引进行查询,即便需要扫描整个聚集索引,效率也比使用非聚集索引效率要高
- 非聚集索引叶节点仍然是索引节点,
如何解决非聚集索引的二次查询问题
-
复合索引(覆盖索引)
总结与使用心得
- 使用聚集索引的查询效率要比非聚集索引的效率要高,
- 但是如果需要频繁去改变聚集索引的值,
- 写入性能并不高,因为需要移动对应数据的物理位置。
- 但是如果需要频繁去改变聚集索引的值,
- 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。
- 不是所有的表都适合建立索引,
- 只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好。