索引问题

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】 V5.2
【复现路径】
对于uuid作为主键时,是不是 聚簇索引就会失效,还是会使用一个隐式的自增 rowid为维护主键?

这句话是不是说明使用聚簇索引可以对字符串,整型都支持?

对,5.X 之后的版本是都支持了

之前的版本对 bigint 更友好… 实际上要满足打散数据的要求, UUID 会更合适…
bigint 还做了很多兼容处理,比如 auto_random 的方式…

rowid 是表示行记录的标识,和主键的关系是若主键是整数,会用主键作为 rowid。

好的,用uuid 就是要维护一个rowid。我以为是一直递增的,现在看到是在表内唯一。

还有一个问题,我之前全是uuid,不是聚簇索引(之前是4.0版本,最近才升级的6.1,v4.0是不支持聚簇索引的),我现在要怎么改成聚簇索引,官网说的不支持修改。

聚簇索引就是主键,不会有额外主键,非聚簇索引的主键表才有额外的rowid。

这里不是说非整形主键会使用一个隐式的自增rowid吗?,还是说如果我创建表的之后显示的设置了SHARD_ROW_ID_BITS才会用一个隐式的自增rowid?如果不显示的设置SHARD_ROW_ID_BITS,就直接使用主键(如果主键是uuid,就用uuid)

这是在聚簇表出来之前的情况
create table t(id varchar(10),name varchar(10),primary key (id));
insert into t values (‘10’,‘a’);
[db16:4000]> select _tidb_rowid,t.* from t;
±------------±—±-----+
| _tidb_rowid | id | name |
±------------±—±-----+
| 1 | 10 | a |
±------------±—±-----+

create table t1 (id varchar(10),name varchar(10),primary key (id) clustered);
insert into t1 values (‘10’,‘b’);
[db16:4000]> select _tidb_rowid,t1.* from t1;
ERROR 1054 (42S22): Unknown column ‘_tidb_rowid’ in ‘field list’

意思是只要有主键就不会用rowid 了。

聚簇索引出来前 只有 除了Int类主键,其他都默认加rowid. 聚簇索引出来后 只要指定为聚簇 那么就不加rowid

那我这个表里面的主键是不是聚簇索引。我这个还是有rowid,但是查询数据的时候可以走主键id 全部查询出来,之前没有用 clustered 指定,但是查询数据的时候没有回表操作,这个主键应该是聚簇索引吧。

这个明显是走的聚簇索引哈,这个表的主键就是FILE_NUMBER


ID是字符型的,没指定clusterde ,主键就是独立索引,pointget表示通过主键、唯一键这种访问的

主键和唯一键也会存储行数据吗?主键和聚簇索引存储数据有什么区别?主键会存储行数据吗?
还有一个问题就是我现在不是聚簇索引,怎么让他变成聚簇索引,官网说不支持修改操作.

https://docs.pingcap.com/zh/tidb/stable/tidb-computing

1.如果是聚簇索引的话,通过 tablePrefix{TableID}_recordPrefixSep{索引值} 找到对应的Value.
Key: tablePrefix{TableID}_recordPrefixSep{RowID}
Value: [col1, col2, col3, col4]
2.如果是主键索引和唯一索引的话,通过 tablePrefix{tableID}_indexPrefixSep{indexID}_索引值找到Value中的RowID,然后通过RowID再去找对应的tablePrefix{TableID}_recordPrefixSep{RowID} 对应的Value

tablePrefix{TableID}_recordPrefixSep{RowID} 方式去找对应的值。
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: RowID
3.如果是普通的二级索引,是通过ablePrefix{TableID}_indexPrefixSep{IndexID}_索引值 范围匹配出 {RowID},再通过RowID 通过tablePrefix{TableID}_recordPrefixSep{RowID} 这种方式去查询value
Key: tablePrefix{TableID}_indexPrefixSep{IndexID}indexedColumnsValue{RowID}
Value: null

不知道我理解的对不对。。。。

基本是这样

还有现在我怎么把表主键弄成聚簇索引哇,要删除表里重新建?

只能重建了