作為阿里雲自研的自研資料平台,tablestore有可靠、海量儲存以及易於擴充套件等特點。但是由於資料模型的限制,原生的tablestore只能基於主鍵做查詢。如果有其他查詢分析需求使用者也只能借助如dataworks、data lake analytics。
對於乙個三主鍵的表,假設三列主鍵分別為x、y、z,對於這種設計我們可以使用的查詢功能相對比較簡單:
精確查詢,指定x、y、z的值
範圍查詢,必須遵循最左匹配原則
指定x的值,y與z為範圍
指定x與y的值,y為範圍
x、y、z均為範圍
全範圍值指(min~max)。優點
1. 效能極佳,根據使用者指定的主鍵可以定位到具體分片
缺點1. 查詢功能相對單一,如果需要指定其他列的話需要使用filter功能,在大資料量的情況下,效能較差
2. 不能修改主鍵結構
但是在很多場景下,需要查詢非主鍵列的屬性列,這個時候上述主表結構就不能滿足需求了,為了解決這個問題,我們開發了類似於關係型資料庫的二級索引(globalindex)。
globalindex使用的是額外的一張tablestore表來實現的,所以索引表的資料模型與tablestore的表完全一致。使用者可以指定任意列(原表的主鍵列或屬性列)作為索引表的主鍵。
如我們原表有以下的幾列:
我們建立的索引的主鍵為:q、x(這裡加上原表主鍵x是為了防止q列的重複,因為屬性列q不一定唯一,但是q與x的組合是一定是唯一的),則我們通過索引表可以完成的查詢組合為:
建立了索引表後,在原先只能通過主鍵進行查詢的基礎上,擴充了查詢的多樣性。
為了不影響使用者資料寫入延遲,我們採用了非同步同步資料的方式。也就是說使用者在將資料寫入原表成功後,是立刻返回的,而資料則是通過我們內部的同步鏈路同步到索引表。所以說資料寫入成功後到索引資料可見,是有一定的延遲的,這個延遲一般為毫秒級別。
globalindex的優缺點總結如下:
優點1. 索引表是tablestore的表實現的,通過索引查詢的效能極佳
2. 通過索引可以進行大範圍查詢(getrange)
3. 增加了通過屬性列查詢的能力
缺點1. 如果查詢需求過於多變,則需要建立多張索引表
2. 查詢固定,不能自由組合查詢
3. 查詢功能略為侷限,只能是範圍、精確值查詢,不能做geo、分詞等查詢
globalindex在原有tablestore表的基礎上,為使用者提供了更多的查詢選擇,並且索引的效能與原生的tablestore表相當,比較適合索引需求相對簡單並且對效能要求很高的使用者。
globalindex雖然查詢能力上有所增強,但是在某些查詢功能上還是無法滿足需求,比如分詞查詢、多欄位自由組合查詢、模糊查詢、地理位置查詢等,為了支援更多的查詢能力,我們為tablestore增加了多元索引,下面我們來看一下多元索引。
與globalindex不同,searchindex底層使用的是自研索引引擎,使用了倒排索引、行存、列存等技術來優化查詢。在資料組織方面與tablestore類似,searchindex底層也是使用「分片」的形式將數組織在一起,但是與globalindex不同的是,預設的話寫入的資料時通過原表主鍵來確定分割槽的。也就是說如通過乙個條件查詢完整結果的話,需要對所有「分片」進行查詢並合併結果。
雖然查詢效能上,特別是一些簡單條件查詢searchindex是要比globalindex要差,但是其優勢在於查詢功能的強大。如果使用者需要對索引列進行多種組合查詢,或這一些更高階的功能,如:geo地理位置查、分詞查詢等,都只需要建立乙個索引就可以完成。
在查詢方面,searchindex比較適合如下的一些場景:
與globalindex類似,資料同步到searchindex也是非同步的。由於searchindex內部實現的原因,資料寫入到searchindex有乙個索引構建的過程。所以除了同步鏈路的延遲,還需要加上索引構建的延遲,整個延遲的話在秒級別。
優點1. 支援的查詢比globalindex更加豐富:or查詢、分詞查詢、geo地理位置查詢等
2. 只需要乙個索引就可以滿足所有查詢需求
3. 多樣性的排序需求
缺點1. 在預設情況下,乙個查詢條件需要查詢所有「分片」才能獲得全部結果
2. 大範圍查詢掃瞄支援不如globalindex強大
3. 同步延遲比globalindex長
與globalindex相比,searchindex在查詢功能的多樣性上要略勝一籌,但是在一些特定的場景,如大範圍掃瞄索引、簡單條件匹配以及對同步延遲敏感的情況下,globalindex效能更佳。在資料延遲方面由於內部實現的原因,searchindex資料延遲為秒級別,而globalindex則為毫秒級別。
globalindex(全域性二級索引)
searchindex(多元索引)
查詢靈活性
只可以使用建立索引時的給出的索引組合進行查詢,
如果需要其他組合則需要再建立新的索引表
可以對索引欄位做任意組合查詢
查詢效能
通過索引鍵可以定位到對應「分片」,效能極佳
不指定路由的話需要查詢所有「分片」
大範圍掃瞄
支援,效能與原生tablestore一致
支援,但效能不及全域性二級索引
資料可見延遲
毫秒級秒級
分詞查詢
不支援支援
geo地理位置查詢
不支援支援
資料一致性
最終一致
最終一致
mysql多索引結構 MySQL 索引結構詳解
innodb的主鍵索引 primary key 是cluster形式的 聚簇索引 innodb的非主鍵索引 secondary index 是普通的b tree索引。兩種索引在root node和branch node是一樣的,在leaf node就不一樣了。primary key存放的是表的實際資...
mysql的聯合索引 mysql聯合索引詳解
聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...
MyISAM與InnoDB索引實現對比詳解
myisam索引實現 這裡設表一共有三列,假設我們以col1為主鍵,則上圖是乙個myisam表的主索引 primary key 示意。可以看出myisam的索引檔案僅僅儲存資料記錄的位址。在myisam中,主索引和輔助索引 secondary key 在結構上沒有任何區別,只是主索引要求key是唯一...