TiDB聚簇表和非聚簇表


    
聚簇表

  • 表中行数据存储与主键存储顺序一致
  • 表的主键为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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值