请问各位老师,tidb v4.0 之前默认全都是 使用聚簇表嘛?
聚簇索引是从 v5.0 开始支持的特性
没有主键的表,都是非聚簇表。聚簇表的要求更高些,不是所有表都能设置为聚簇表。
聚簇表这个功能(table语法中使用clustered)是5.0版本开始有的,但从存储形式上实际在5.0之前就有,仅限于单列bigint主键表。如果开启alter-primary-key的情况下,主键也是一个独立的索引,类似于oralce的堆表+主键索引。5.0版本后的聚簇索引支持非bigint列的主键和单列bigint列主键表的类似存储格式,表中没有了rowid,tikv的key格式也由rowid变成了主键索引列。聚簇索引在使用上会有比较多的限制。
怎么样看到表是以聚簇的形式存储还是以非聚簇的形式存储呢?
mysql> CREATE TABLE t
( a
varchar(20) primary key);
Query OK, 0 rows affected (0.51 sec)
mysql> CREATE TABLE t
( a
int(20) primary key);
Query OK, 0 rows affected (0.51 sec)
我在4.0.15 版本中,以int 和varchar 字段建立主键都是OK的,但是不知道怎么通过底层去查看是聚簇还是非聚簇?
必然不可能啊,有些表就不是聚簇表,那怎么搞,难道tidb就不支持了?
4.x 中没有聚簇表的概念
但是,4.x 中有聚簇表的表现形式
比如,主键是 bigint, 然后主键索引 也是唯一,不需要以 row_id 的形式表达,少了一项索引开销
然后 主键能满足打散的要求,比如 支持 auto_random的形式,或者 自己采用 snowflake 的算法来生成 id,并且支持 高位换算能满足 打散的一个标准(多tikv 节点 + 多 region)
满足以上两项的情况下,和聚簇表的表现类似,也可以满足高性能的场景