全部產品
Search
文件中心

PolarDB:使用多機MPP對海量資料分析提速

更新時間:Nov 27, 2024

本文介紹了多機並存執行能力的技術背景、技術原理、適用情境以及使用說明等內容。

背景資訊

列存索引(IMCI)是PolarDB的HTAP解決方案。隨著使用者查詢資料量、查詢複雜度以及對OSS等外部表格的查詢需求的增加,單個唯讀列存節點已無法滿足海量資料情境下的效能需求。因此,IMCI提供了多機並存執行能力和資源彈升能力。

技術架構

列存索引多機並存執行技術架構如下:

列存索引多機並行是由多個唯讀列存節點群組成的一個多機執行組,並提供多機並存執行能力。隨著使用者查詢負載的變化,使用者可以快速增加或減少唯讀列存節點的個數,以平衡查詢效能和計算成本。

多機並存執行可以處理多種類型的AP負載,IMCI的最佳化器可以準確判斷出適合查詢語句的TP,並選擇單機執行AP或多機並存執行AP,最終將查詢語句調度到適合的列存節點上。

適用情境

  • 通過多機並行的資源彈升能力擴充CPU和IOPS,降低查詢時延。

  • 通過每台機器只處理部分資料來提升資料緩衝能力,將單機無法做到的全記憶體情境轉變為多機全記憶體情境,從而提升查詢的輸送量。

版本限制

PolarDB MySQL版叢集的產品版本需為企業版,叢集版本需為PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.38及以上。

使用說明

  1. 添加多個唯讀列存節點。具體操作請參見添加唯讀列存節點

  2. 通過DingTalk搜尋群號27520023189並加入該群,將會有對應的研發人員協助您開啟並使用列存索引的多機並行能力。

最佳實務

分區鍵

PolarDB中一級或二級分區採用HASHKEY類型的分區策略的分區表,在IMCI多機執行環境中的處理方式為share-nothing。這種方式意味著每個分區僅由一台機器進行處理,從而產生以下優勢:

  • 提升資料緩衝能力:每台機器只需處理其負責的分區,有助於更有效地利用本地記憶體快取資料。

  • 最佳化查詢效能:在基於分區鍵進行的JOIN 操作和GROUP BY查詢時,只需在每台機器上本地處理資料,即可顯著減少多機之間的資料轉送量。

基於上述原因,建議在建表時,根據常用的JOINGROUP 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語句會通過列存索引多機並存執行。