1. 程式人生 > >總結:Sql與TiDB儲存的對映

總結: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)  ;