聚簇表
- 表中行数据存储与主键存储顺序一致
- 表的主键为KV映射中Key的一部分
- 通过主键访问记录时,可以直接获取行记录
- 创建方法:CREATE TABLE t(a BIGINT PRIMARY KEY CLUSTERED, b VARCHAR(2550);
非聚簇表
- 表中行数据存储顺序和主键存储的顺序不一定一致的表即非聚簇表
- 行数据的KEY由TiDB内部隐式分配的_tidb_rowid构成,主键本质上是唯一索引
- 通过主键访问行记录时,不可以直接获取行记录,需要先从额外存储的主键获取行的_tidb_rowid,再通过行的_tidb_rowid获取行记录。相比聚簇表多一次回表操作;
- 创建: CREATE TABLE t(a BIGINT PRIMARY KEY NONCLUSTERED,b VARCHAR(255));
查询表是否为聚簇表:
- SHOW CREATE TABLE
- SHOW INDEX FROM
- 查询information_schema.tables 中的TIDB_PK_TYPE列
主键的添加删除
聚簇表:
- 目前TiDB不支持在建表后添加或者删除聚簇索引,也不支持聚簇索引和非聚簇索引的互相转换;
非聚簇表:
- TiDB支持建表后添加或者删除非聚簇索引(主键),此时可以显式指定NONCLUSTERD关键字或省略关键字;
- alter table hero3 drop primary key ;
- alter table hero3 drop index `primary`;
- alter table hero3 add primary key(id);
- alter table hero3 add primary key(id) nonclustered;
SHARD_ROW_ID_BITS
NONCLUSTERED表会使用隐式自增rowid,造成写热点
SHARD_ROW_ID_BITS通过调整隐式生成的_tidb_rowid的高位,从而更容易拆分不同的region来打散热点。
SHARD_ROW_ID_BITS = 4 表示16个分片
SHARD_ROW_ID_BITS = 5 表示32个分片
一般使用SHARD_ROW_ID_BITS同时,会配合PRE_SPLIT_REGIONS,建表后将Table拆分成2^PRE_SPLIT_REGIONS 个Region;
mysql> show create table hero4\G
*************************** 1. row ***************************
Table: hero4
Create Table: CREATE TABLE `hero4` (
`id` int(11) NOT NULL,
`name` varchar(200) DEFAULT '',
PRIMARY KEY (`id`) /*T![clustered_index] NONCLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T! SHARD_ROW_ID_BITS=4 PRE_SPLIT_REGIONS=2 */
1 row in set (0.00 sec)