关于聚簇表和非聚簇表的问题

【 TiDB 版本】v6.5.5
随着tidb版本的提升,在使用tidb数据库的过程中关于聚簇表和非聚簇表的一些概念出现了模糊,有如下问题请教:

关于聚簇表

  • 聚簇表的键值对是: 主键列数据(键) - 行数据(值)
    • 我的疑问1:如果表的主键不是整数或者主键不是1个,那么这个聚簇表的键值对还是这样吗?有没有创建tidb_rowid
    • 我的疑问2:聚簇表的二级索引的键值对是怎么组成的,如果主键不是整数或者主键不是1个会不会发生变化呢?

关于非聚簇表

  • 非聚簇表的键值对:
    • tidb_rowid(键)- 行数据(值)
    • 主键列数据(键) - _tidb_rowid(值)
  • 我的疑问是,如果这个非聚簇表的主键是整数,那么这个表的二级索引中的键值对的组成是优化成了主键值还是说就是tidb_rowid?如果按照表数据的组成,应该是tidb_rowid效率更高吧,但是在文档https://docs.pingcap.com/zh/tidb/stable/tidb-computing#索引数据和-key-value-的映射关系 中并没有把两种表类型区别开

1:表的主键不是整数或者主键不是1个,高版本的还是键值对,key是主键values数据,没有建tidb_rowid
2:第二个是用的_tidb_rowid
测试
image

非聚簇表keyi用的是_tidb_rowid

2 个赞

聚簇表的二级索引,如果主键不是整数,用的是_tidb_rowid吗

聚簇表的索引与rowid无关。
无论是聚簇表还是非聚簇表,索引的键是索引列的值,键值是数据键值对中键的值,对于聚簇表是主键,对于非聚簇表是rowid。

聚簇表跟非聚簇表的区别就是聚簇表 的主键为KV映射中Key的一部分,非聚簇表KEY由TiDB内部隐式分配的_tidb_rowid构成,主键本质上是唯一索引,只有非聚簇表才有_tidb_rowid
对于建表时聚簇表还是非聚簇表可以显示指定
对于未显式指定该关键字的语句,默认行为受系统变量 @@global.tidb_enable_clustered_index 影响。该变量有三个取值:

  • OFF 表示所有主键默认使用非聚簇索引。
  • ON 表示所有主键默认使用聚簇索引。
  • INT_ONLY 此时的行为受配置项 alter-primary-key 控制。如果该配置项取值为 true,则所有主键默认使用非聚簇索引;如果该配置项取值为 false,则由单个整数类型的列构成的主键默认使用聚簇索引,其他类型的主键默认使用非聚簇索引。

聚簇表没有_tidb_rowid的,你可以测试下,和主键是不是整数无关

rowid 是,默认有的,只是用没用,什么时候用的问题。

非聚簇表不论是否有主键都有个隐藏列rowid

聚簇表没有_tidb_rowid,你可以试试查询会报错

聚簇表的主键不是整数或者主键不是1个,聚簇表没有创建_tidb_rowid,你可以试着创建主键不是整数或者主键不是1个字段的聚簇表,然后查询下_tidb_rowid是否报错就知道了;我理解这个时候它的键值已经变成了其主键值(目前没有具体证据认证,不知道有没有大佬可以证明下 :grinning:)。

我理解同上,聚簇表的二级索引的键值对的键值中的RowID这一部分也变成了主键值;

聚簇表使用主键,非聚簇表使用tidb_rowid

tidb 只有聚簇索引和非聚簇索引的概念吧?好像是没有二级索引这个说法

聚簇表的除主键外索引就是二级索引啊

说法都不重要,看怎么理解

当然重要,聚簇表数据按主键有序排列的,主键并没有物理上的索引,二级索引是有额外的物理存在的索引

tidb有二级索引说法,看官方文档


创建二级索引 | PingCAP 文档中心

非聚簇表应该也是除主键外索引都是二级索引吧

是不是可以理解:聚簇表和非聚簇表除了主键之后 都是二级索引

聚簇表是按主键存储的,二级索引指向的是主键的key,所以叫二级索引
非聚簇表,数据存储是_tidb_rowid,主键跟普通索引一样指向的都是_tidb_rowid,所以不应该叫二级索引

聚簇表除了主键 都是二级索引
非聚簇我认为都是二级索引,主键就是一个唯一非空索引而已,主键是隐藏的_tidb_rowid