TiDB的索引可以分为主键索引和二级索引。主键索引就是在主键字段上建立的索引,二级索引是在非主键字段上建立的索引。
主键索引
1 聚簇索引
表的数据在存储的时候就是按照主键字段进行排序存储的,由于表按主键排序,因此不需要额外增加索引结构就可以实现按主键字段进行快速高效的查询和过滤。较新的TiDB版本中默认创建的主键索引即为聚簇索引(由参数tidb_enable_clustered_index来控制的,ON表示所有主键默认创建为聚簇索引,OFF则表示默认创建为非聚簇索引。
)。
2 非聚簇索引
本身的数据存储并不是按主键字段排序的。在较新的TiDB版本中,如果想定义一个主键为非聚簇索引,需要显式在建表语句中定义NONCLUSTERED关键字。
对比
TiDB底层存储是KV结构,在聚簇索引中TiDB是把主键字段直接映射到Key中,但非聚簇索引中Key是由TiDB内部隐式分配的**_tidb_rowid**构成,主键本质是唯一索引。
聚簇索引的优势
- 插入数据时,减少一次索引数据写入
- 等值查询时,减少一次索引数据读取
- 范围查询时,减少多次索引数据读取
聚簇索引的劣势
- 当批量插入大量取值相邻的主键时,可能产生表上较大的写热点问题
- 当查询只需要获取少量字段时,由于要把整行数据取出可能导致性能反而不如非聚簇
- 不支持在建表后添加或删除聚簇索引