包老师讲的例子很全,但是在整个课程中,其实没有最终执行完所有的sql语句,所以我去自己执行了下,发现了一些小问题
包老师讲的时候,是说只有int类型的主键,会被默认作为聚簇索引,但是我执行了第三个sql,也就是如下:
DROP TABLE IF EXISTS test.t3_nonclustered;
CREATE TABLE test.t3_nonclustered (
id VARCHAR(32) PRIMARY KEY,
id2 BIGINT,
name CHAR(255),
varname CHAR(200));
实际上我通过以下语句去验证时
show index from test.t3_nonclustered;
返回如下
同时我去查 _tidb_rowid 也不存在,我就想是不是我实验版本的问题,当前tidb的实验版本是6.6.0,我就去翻了官方文档,找出来了一个如下属性,或许可以解释这个问题
https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_enable_clustered_index-从-v50-版本开始引入
大概就是说,目前这个属性默认值为ON,所以在不声明聚簇或者非聚簇的情况下,默认行为是所有主键均使用聚簇索引,而包老师想表达的意思,跟这个属性设置为
INT_ONLY
时的情况比较类似,不知道是不是以前老版本的时候默认值为 INT_ONLY
。
在聚簇索引那页上写着5.0版本,兼容老版本,这一行不知道是不是官方的bug,至少目前看来,两边描述并不一致
兼容性
升降级兼容性
TiDB 支持对聚簇索引表的升级兼容,但不支持降级兼容,即高版本 TiDB 聚簇索引表的数据在低版本 TiDB 上不可用。
聚簇索引在 TiDB v3.0 和 v4.0 中已完成部分支持,当表中存在单个整数列作为主键时默认启用,即:
- 表设置了主键
- 主键只有一列
- 主键的数据类型为整数类型
TiDB v5.0 完成了所有类型主键的支持,但默认行为与 TiDB v3.0 和 v4.0 保持一致。要修改默认行为,请设置系统变量 @@tidb_enable_clustered_index
为 ON
或 OFF
。
在这边mark一下,还是得多实验。