非主键索引保存的键值是否有序?

  • 【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 里这个索引是怎么存储的?

这个 Map 中的 Key-Value pair 按照 Key 的二进制顺序有序
https://docs.pingcap.com/zh/tidb/stable/tidb-storage#key-value-pairs(键值对)

对于同一个 groupid,那么里面的 value 是怎么排序呢?

比如 groupid 4 那么 key 应该是 4 吧? 对应多个 userid [5,6,7,9,20,40,4]

userid是primary key,当然是按照user id排序了,怎么可能 groupid 4 是 key 呢?

没理解问题吧, groupid 也有索引,userid 是 primary key 没错,但现在是需要从 groupid 的索引找 userid,那么 groupid 索引的 key 难道还是 userid?

对于不需要满足唯一性约束的普通二级索引,一个键值可能对应多行,我们需要根据键值范围查询对应的 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

明白了,感谢!

:handshake:

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。