本文介紹了多機並存執行能力的技術背景、技術原理、適用情境以及使用說明等內容。
背景資訊
列存索引(IMCI)是PolarDB的HTAP解決方案。隨著使用者查詢資料量、查詢複雜度以及對OSS等外部表格的查詢需求的增加,單個唯讀列存節點已無法滿足海量資料情境下的效能需求。因此,IMCI提供了多機並存執行能力和資源彈升能力。
技術架構
列存索引多機並存執行技術架構如下:
列存索引多機並行是由多個唯讀列存節點群組成的一個多機執行組,並提供多機並存執行能力。隨著使用者查詢負載的變化,使用者可以快速增加或減少唯讀列存節點的個數,以平衡查詢效能和計算成本。
多機並存執行可以處理多種類型的AP負載,IMCI的最佳化器可以準確判斷出適合查詢語句的TP,並選擇單機執行AP或多機並存執行AP,最終將查詢語句調度到適合的列存節點上。
適用情境
通過多機並行的資源彈升能力擴充CPU和IOPS,降低查詢時延。
通過每台機器只處理部分資料來提升資料緩衝能力,將單機無法做到的全記憶體情境轉變為多機全記憶體情境,從而提升查詢的輸送量。
版本限制
PolarDB MySQL版叢集的產品版本需為企業版,叢集版本需為PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.38及以上。
使用說明
添加多個唯讀列存節點。具體操作請參見添加唯讀列存節點。
通過DingTalk搜尋群號27520023189並加入該群,將會有對應的研發人員協助您開啟並使用列存索引的多機並行能力。
最佳實務
分區鍵
PolarDB中一級或二級分區採用HASH和KEY類型的分區策略的分區表,在IMCI多機執行環境中的處理方式為share-nothing。這種方式意味著每個分區僅由一台機器進行處理,從而產生以下優勢:
提升資料緩衝能力:每台機器只需處理其負責的分區,有助於更有效地利用本地記憶體快取資料。
最佳化查詢效能:在基於分區鍵進行的
JOIN操作和GROUP BY查詢時,只需在每台機器上本地處理資料,即可顯著減少多機之間的資料轉送量。
基於上述原因,建議在建表時,根據常用的JOIN和 GROUP BY分區鍵來設定HASH或KEY類型的一級或二級分區。此外,所有的HASH或KEY類型分區需要具有相同的分區數量,因為如果兩個表的分區數量不同,則它們之間的JOIN操作無法在本地進行處理。
推薦選擇一個足夠大的質數作為分區數量,這是為了減少資料分布不均勻的可能性,進一步提升查詢效能和系統資源的有效利用。
排序鍵
海量資料的過濾可以通過使用範圍(range)類型的分區或在列儲存中增加排序鍵來實現。建議對where中能用predicate大量過濾的列建立range分區和增加排序鍵。例如,針對如下的查詢條件:WHERE date > '2024-10-01' AND date < '2024-10-07' AND customer_id = 'X231'可以為date列建立定界分割,並為customer_id列增加IMCI排序鍵。這種做法可以顯著減少需要處理的資料量,從而提升查詢效能。 通過合理配置分區和設定列索引的排序鍵,不僅可以提高資料處理效率,還能最佳化海量資料環境下的查詢響應速度。
效能測試
列存索引的多機並存執行效能測試請參見列存索引(IMCI)效能。
其他動作
判斷當前SQL語句是否可以使用列存索引的多機並行能力
您可以通過在SQL語句中添加HINT文法
SET_VAR(imci_plan_use_mpp=forced)來查看SQL語句的執行計畫,以此來判斷該SQL語句是否可以使用多機並行能力。樣本如下:EXPLAIN SELECT /*+ SET_VAR(imci_plan_use_mpp=forced) */ COUNT(*) FROM nation;查詢結果如下:
+----+----------------------------+--------+---------------------------------------------------------------------------------+ | ID | Operator | Name | Extra Info | +----+----------------------------+--------+---------------------------------------------------------------------------------+ | 1 | Select Statement | | IMCI Execution Plan (max_dop = 11, max_query_mem = 37438953472) | | 2 | └─Compute Scalar | | | | 3 | └─Aggregation | | | | 4 | └─Consume | | Consume ProducerPipeId: 1 | | 5 | └─Exchange | | PipeId: 1, Consumers: 23377031, Producers: 23377031,23377032, Part Type: Gather | | 6 | └─Aggregation | | | | 7 | └─Table Scan | nation | | +----+----------------------------+--------+---------------------------------------------------------------------------------若執行計畫中有Exchange運算元,則表示該SQL語句可以使用列存索引的多機並行能力。
判斷某條SQL語句是否會通過列存索引的多機並行能力執行
當判斷出某條SQL語句可以使用列存索引的並存執行能力後,您可以通過查看某條SQL語句的執行計畫來查看是否會使用列存索引的多機並行能力。若執行計畫中有Exchange運算元,則表示該SQL語句會通過列存索引多機並存執行。