在学DEV COURSE 3:TiDB 特有功能与事务控制里面,讲到主键不是int数据类型,那么tidb 会为表创建非聚簇索引,但是根据我的测试来看,create table t1(id varchar(10) primary key,a varchar(10));
建一个表,然后主键字段是varchar,通过show create table t1来查看,发现是聚簇索引表,不知道是不是课程里面说的不对?
创建表时如果未显式指定主键为CLUSTERED,那么是否为聚簇表由系统变量tidb_enable_clustered_index决定,它的作用域为SESSION/GLOBAL,默认值为INT_ONLY
-
INT_ONLY:如果主键由单个整数类型字段构成,则为IOT表,其它类型为非IOT表
-
OFF:非IOT表
-
ON:总为IOT表
感谢回复,也就是说有参数控制着是否非int字段是否可以充当主键
- v5 版本以后,是的(有参数控制着是否非int字段是否可以充当主键),但是不严谨,应该是 不管是不是 int 都可以做主键,只是作为主键后的表 是不是 聚簇表。聚簇表具有较好的性能,数据 row 定位能力。
- 这个问题其实要追溯 TiDB 聚簇表的演进,在 v4 及以前是没有这个参数的,即:int 主键就是聚簇表,其他就是非聚簇表,这是数据存储模型中 key 的编码格式决定的。
- 但随着演进,非聚簇表使用存在一定性能问题,通常需要回表(从 index 中找到 row_id 回表,徒增网络消耗,步骤逻辑),本可以直接点查解决(在注重 TP 的场景有较大提升)。v5 tidb 支持了其他类型做主键的聚簇表 功能。 为了兼容以前版本,出现了这个参数