表格存儲 SQL 查詢多元索引
多元索引是表格存儲產品中一個重要的功能,多元索引使用倒排索引技術為表格存儲提供了非主鍵列上的快速檢索功能,另外也提供了統計聚合功能。表格存儲近期開放了SQL查詢功能,SQL引擎默認從原始表格中讀取數據,非主鍵列上的查詢需要掃描全表。開啟了多元索引之后,如果一個查詢的過濾條件或者統計聚合可以下推至多元索引執行,那么SQL引擎將部分查詢計劃轉換為多元索引請求,將從多元索引中獲取數據,提高查詢效率。
一 多元索引SQL算子支持
1 前提條件
在使用SQL查詢多元索引之前,首先需要在表格上創建多元索引。如果多元索引包含SQL語句中涉及的數據列,則SQL引擎會通過多元索引讀取數據并下推多元索引支持的算子。例如有一張表exampletable有a, b, c, d四列,多元索引中包含了b, c, d三列,只有當SQL語句中只涉及b, c, d中的數據列時,才會從多元索引讀取數據。
- SELECT a, b, c, d FROM exampletable; /* 多元索引不包含a,b,c,d,掃描全表讀取數據,不支持算子下推 */
- SELECT b, c, d FROM exampletable; /* 多元索引包含b,c,d,通過多元索引讀取數據,支持算子下推 */
2 支持下推的算子
表格存儲支持WHERE語句中的部分邏輯運算符和關系運算符下推,以及聚合函數和LIMIT算子下推。
二 多元索引SQL查詢實戰
為了直觀地展示SQL查詢多元索引功能,下文將以某自行車租賃商的訂單表為例,使用多元索引上的SQL功能完成一些簡單的查詢分析任務。某自行車租賃商的訂單表如下:
整張表格名為trips,每一筆租車訂單都有唯一的訂單號作為主鍵,訂單中記錄了租車時長、開始日期、結束日期、開始站點、結束站點等信息。表格中包含120萬行數據,在沒有開啟多元索引的情況下對表格行數進行統計,查詢會因為超出掃描配額限制而終止。
同樣地,如果以非主鍵列作為查詢條件進行查詢,也會因為涉及全表掃描超過掃描配額而被終止。
為了能夠根據非主鍵列的值進行查詢以及統計聚合,需要創建覆蓋全部數據列的多元索引。對于數據量比較大的表格,需要較長的時間等待多元索引同步完成。
1 過濾條件下推
在開啟多元索引之后,即可在非主鍵列上進行條件查詢。例如,下圖查詢起點編號31208到起點編號31209的租車訂單,借助多元索引,SQL引擎能夠在500毫秒之內查詢到全表中滿足條件的140行記錄。
多元索引支持多個條件的組合,例如查詢2010年10月1日當天,站點31208的訂單。由于外國10月1日不放假,那天的訂單數量并不是很多。
2 統計聚合下推
除了非主鍵列查詢,多元索引還提供了強大的統計聚合能力。在未創建多元索引的時候無法統計行數,但是有了多元索引,能在500毫秒左右查詢到行數、站點數、平均租車時長等信息。
同樣地,分組統計聚合也可以快速獲取結果,例如列出每個站點總訂單數目。
過濾條件和統計聚合可以一起使用,例如查詢2010年10月1日當天每個站點訂單數目。
3 TopN下推
SQL中包含ORDER BY和LIMIT的語句成為TopN查詢,多元索引支持快速查詢TopN,圖中的查詢展示了最近的10條數據。