總結:Sql與TiDB儲存的對映
另一種是 Range 查詢,如 select name from user where age > 30 and age < 35;
,這個時候需要通過idxAge
索引查詢 age 在 30 和 35 之間的那些資料。
二、TiDB的儲存結構
TiDB 對每個表分配一個 TableID,每一個索引都會分配一個 IndexID,每一行分配一個 RowID(如果表有整數型的 Primary Key,那麼會用 Primary Key 的值當做 RowID),其中 TableID 在整個叢集內唯一,IndexID/RowID 在表內唯一,這些 ID 都是 int64 型別。
每行資料按照如下規則進行編碼成 Key-Value pair:
Key: tablePrefix{tableID}_recordPrefixSep{rowID} Value: [col1, col2, col3, col4]
其中 Key 的 tablePrefix
/recordPrefixSep
都是特定的字串常量,用於在 KV 空間內區分其他資料。
對於 Index 資料,會按照如下規則編碼成 Key-Value pair:
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue Value: rowID
Index 資料還需要考慮 Unique Index 和非 Unique Index 兩種情況,對於 Unique Index,可以按照上述編碼規則。但是對於非 Unique Index,通過這種編碼並不能構造出唯一的 Key,因為同一個 Index 的 tablePrefix{tableID}_indexPrefixSep{indexID}
ColumnsValue
是一樣的,所以對於非 Unique Index 的編碼做了一點調整:
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue_rowID Value: null
三、Sql到TIDB資料的對映
經過上面的儲存結構,我們可以分析出,查資料需要具備的基本元素:table,索引名,索引value,如果是點查的話,提供ID等
1、如果不帶條件,如下:
select * from table;這種查詢只需要提供table就行,是個Range對映;
2、帶主鍵或唯一索引條件的點查:
select * from table where id=100;這種查詢對映:tableid + rowid即可;
2、帶索引條件的範圍查:
select * from table where name='tom';這種查詢對映:tableid + indexid + indexvalue ,這樣就能查出多條資料;
3、帶條件的Range查:
select * from table where age >30 and age <40;這種查詢對映:tableid + indexid + indexvalue(30) ~ tableid + indexid + indexvalue(40) ;