tidb二级索引插入和查找是如何工作的

在看tidb二级索引时有个问题,困惑很久,希望各位指点:

假设有个user表,只有两列:(uid,email),其中uid是主键,email是二级索引,那么主键索引和二级索引映射成kv对大致结构分别如下:
uid->email
email->uid
请问这时memtable中还是只有一个以uid(key)排序的跳表吗?

如果是的话,那么插入语句如下:
insert into user values (20,e1@163.com);
假设现在这条数据已写入memtable但尚未落盘到sstable,这时有一条查询:
select * from user where email=‘e1@163.com’;
那么这条语句是如何通过二级索引email定位到uid,然后取值的?

感谢大佬解惑回答

1 Like

memtable 刷盘到 sst 是同步的,所以必须 sync log 成功以后,才可以查到。

1 Like

谢谢。我个人理解,写memtable和sync log是同步,sync log后就可以返回给用户成功,但落盘到sst应该是异步的吧?

是的,理解没有问题。可以看一下文档 https://www.modb.pro/db/46583

感谢,我都不好意思了,但看资料还是没明白:sweat_smile:。我其实就是理解不了:当数据已写入wal并写到memtable,但还未写到sstable,这时使用二级索引“email”查找数据(select* from email=‘xxx’),是如何在memtable中用email=xxx的key值定位数据的。因为说memtable中只有一个以主键值为key排序的跳表嘛,用主键查就比较好理解,用二级索引查我就懵了。

二级索引存储和数据存储的 KV 的格式不一样,但是在查询逻辑中,读取和数据读取是一样的,在 TiKV 访问不同的 Region 范围。

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