- 【TiDB 版本】:任意
- 【问题描述】:非主键索引保存的键值是否有序?
比如下面表
CREATE TABLE `group_users` (
`userid` bigint(20) unsigned NOT NULL,
`groupid` int(11) unsigned NOT NULL,
PRIMARY KEY (`userid`),
KEY `gid` (`groupid`)
)
一个 groupid 对应 N 个 userid
现在有个需求是根据 groupid 遍历 userid,但是 userid 数量太多需要用 limit 来分页取
类似下面 SQL
select * from group_users where groupid=2 limit 20,1000
不知道 groupid 索引里保存 userid 是按插入顺序,还是数值大小
在 TiKV 里这个索引是怎么存储的?
yilong
(yi888long)
2
对于同一个 groupid,那么里面的 value 是怎么排序呢?
比如 groupid 4 那么 key 应该是 4 吧? 对应多个 userid [5,6,7,9,20,40,4]
yilong
(yi888long)
4
userid是primary key,当然是按照user id排序了,怎么可能 groupid 4 是 key 呢?
没理解问题吧, groupid 也有索引,userid 是 primary key 没错,但现在是需要从 groupid 的索引找 userid,那么 groupid 索引的 key 难道还是 userid?
yilong
(yi888long)
6
对于不需要满足唯一性约束的普通二级索引,一个键值可能对应多行,我们需要根据键值范围查询对应的 RowID。 因此,按照如下规则编码成 (Key, Value) 键值对:
Key: tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue_{RowID}
Value: null
一个索引的数据也会按照索引数据的具体的值(编码方案中的 indexedColumnsValue
)顺序地排列在 Key 空间内
https://book.tidb.io/session1/chapter3/tidb-kv-to-relation.html
system
(system)
关闭
9
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。