select * from t where id = 100; 这种查询TiDB server 把sql语句转换成kv查询后,会根据k去PD server里查找k所在的region吗?如果是这样的化,sql查询时什么时候用到的lsm索引呢?
感谢各位,没找到文档里哪里有写一条sql执行的整个过程。
根据 key 去 PD 查询 key 所在的 tikv 信息、regin 信息并去 leader regin 上进行查询数据, 这个在 TiDB 中存在缓存, 所以并不是每次都会查询; 在确定 TiKV 后会懂 rocksDB 中逐级进行查找
从pd查到是哪个region后,只是交给region所在的tikv去查询,然后tikv对应的region去接受请求,最终走到rocksdb层,还是当前tikv的所有key混在一起,相当于对rocksdb执行一次kv查询。
你问的问题应该是索引和lsm-tree是怎么工作的。
你把索引和lsm-tree弄混了,lsm-tree是物理上的查找原理,索引是逻辑上的。
region是rocksdb的一个逻辑分段。
kv映射中k等于表ID+主键,或者表ID+rowid,v存储数据。
建立索引后k新增kv,这里的k等于表id+主键+索引id,v存储指向的行号。
查询过程中,使用索引,比较没加索引的查询,扫描的数据更少,速度更快。
1 个赞
针对“没找到文档里哪里有写一条sql执行的整个过程。”
专栏 - 《一条select 语句在TiDB Server层都发生了什么》 | TiDB 社区
这只是一个逻辑示意图,实际还非常复杂。
参考
TiDB 源码阅读系列文章(三)SQL 的一生 | PingCAP
TiDB 源码阅读系列文章(六)Select 语句概览 | PingCAP
在进行 KV 查询时,可以使用 LSM 索引来加速查询速度。
tidb会缓存pd里面的kv位置信息,如果缓存查不到才去pd查
lsm tree是tikv底层的数据组织方式