PolarDB MySQL版列存索引(IMCI)為您提供自動列存索引提速功能,協助您自動無感地提升慢SQL的查詢速度。
功能概述
PolarDB MySQL版的列存索引(IMCI)技術專為OLAP情境下的巨量資料量複雜查詢設計。通過列存索引,PolarDB MySQL版可以實現即時交易處理與即時資料分析的一體化能力,成為一站式的HTAP資料庫解決方案。
在傳統使用方式中,若要對慢查詢涉及的表進行加速,您需要手動通過CREATE TABLE或ALTER TABLE在表的COMMENT欄位中添加COLUMNAR=1來建立列索引。當SQL模板數量眾多、邏輯複雜時,手動方式效率較低。
自動列存索引提速功能(AutoIndex)可根據慢查詢情況自動對目標表添加列索引,從而加速查詢,無需您手動操作。
技術背景
AutoIndex是一種基於自動添加索引來調優SQL效能的技術手段。對於行存索引,業界已有充分的研究和商業落地案例(如Oracle、SQL Server等),通常從謂詞(Predicate)、排序(Order By)或串連(Join)等角度,分析可能需要添加的二級索引,並在假設建立該索引後重新計算代價,選擇可顯著降低查詢代價的索引進行建立。
在列索引領域,AutoIndex已被應用到Redshift、Snowflake、Databricks、Heatwave等系統中。典型的自動化手段包括:
自動Load/Unload:根據查詢執行情況自動建立列索引並加速慢查詢;對於不常用或佔用資源過多的列索引自動刪除,減少空間消耗。
自動Encode:根據每列資料分布自動選擇最優的編碼演算法,進一步壓縮儲存空間。
自動選取Distribute Key:使資料在MPP情境下分布更均衡,減少資料扭曲,同時最佳化分布式GroupBy與Join的資料Shuffle。
自動選取Sort Key:結合常用謂詞或串連、排序列來加速查詢過濾或排序。
在IMCI中自動建立列索引比建立行索引的代價更低,容錯性也更高,原因如下:
寫入影響更小:行存索引過多會顯著影響主節點寫入效能,而IMCI在主節點上並不物化列存資料。新增列索引後,只需通過Redo將寫入操作同步到列存索引唯讀節點,對寫入效能幾乎不造成影響。
更高壓縮率:列索引一般能達到3~5倍的壓縮率,新增索引在儲存空間上的開銷相對更小。
對業務影響有限:無鎖高效的資料結構採集SQL跟蹤資訊,以及使用Nonblock DDL(非阻塞DDL)降低對業務的幹擾。
實現原理
慢查跟蹤與DDL語句產生
叢集各節點使用SQL Trace功能採集慢查詢,對合格SQL自動產生建立列索引的DDL語句。具體流程如下:
SQL Trace:以SQL模板為鍵,採用MySQL官方的無鎖雜湊表跟蹤和記錄SQL執行資訊,可適配高並發、海量SQL模板情境。在Sysbench測試情境下,SQL Trace對資料庫效能的影響不超過3%。
觸發條件:當某個慢查詢的掃描行數達到設定閾值時,AutoIndex會產生給相應表添加列索引的DDL語句。
低開銷設計:為避免重複解析SQL、開啟表(open table)以及擷取MDL鎖,AutoIndex會直接使用已緩衝的THD(Thread Handler)的table list,幾乎不額外增加系統負擔。
您可以直連至各節點,查詢information_schema.imci_autoindex系統資料表,瞭解已追蹤並產生DDL語句集合的慢查詢資訊。樣本如下:
SELECT * FROM information_schema.imci_autoindex結合information_schema.sql_sharing可擷取更詳細的SQL執行資訊:
SELECT *
FROM information_schema.imci_autoindex autoindex, information_schema.sql_sharing share
WHERE autoindex.sql_id = share.sql_id
AND share.type = 'SQL'慢查收集彙總與DDL語句執行
叢集中的列存索引唯讀節點(若有多個,則其中一個擔任Leader角色)會收集並匯總各節點上存在列索引推薦的慢查詢,並按執行時間倒序排序,依次執行推薦的DDL語句,直至達到單輪可執行檔DDL數量閾值。
Instant DDL
添加列索引的操作在主節點是Instant DDL,只需修改資料字典,並不會在主庫做實際資料改動。對應的Redo會複製到列存索引唯讀節點,由後者在後台構建列索引。
Nonblock DDL(非阻塞DDL)
普通DDL在等待擷取MDL-X鎖期間會阻塞新事務進入。而Nonblock DDL在擷取鎖失敗時,會先允許新事務進入,再不斷重試擷取鎖。對於AutoIndex情境,DDL並非緊急操作,一旦本輪失敗,可在下輪自動調度中繼續嘗試。
您可以通過叢集地址查詢information_schema.imci_autoindex_executed系統資料表,查看最近執行成功的列索引推薦語句及關聯慢查詢(最多保留128條記錄)。
調度與執行限制
預設情況下,輪次間隔為1分鐘,每輪最多執行5條DDL語句。
未在本輪被覆蓋的列索引需要等待後續慢查詢再次命中才能被重試。
列存索引唯讀節點在構建列索引時會受資源管控,雖然會引起資源指標上升,但不會打滿節點資源。
本輪次列索引在列存索引唯讀節點上構建完成後,才會開始調度下一輪次。
列索引生效與使用
為充分發揮AutoIndex效果,推薦將列存索引唯讀節點掛在叢集地址下,開啟行列自動分流。在真實業務流量回放過程中,慢查詢會觸發AutoIndex建立列索引。當列存索引唯讀節點完成索引構建後,行列自動分流機制可根據查詢代價將相關查詢路由到列存索引唯讀節點,從而獲得加速效果。
如果業務流量直連普通唯讀節點,則在列索引建立完成後,可手動將流量切換到列存索引唯讀節點。列索引的狀態查詢、分流策略等資訊,請參見列存索引常見問題。
測試效果
以下為基於TPC-H 100 GB測試集的樣本。
本文的TPC-H的實現基於TPC-H的基準測試,並不能與發行的TPC-H基準測試結果相比較,本文中的測試並不完全符合TPC-H的所有要求。
環境準備:每隔1分鐘執行一遍22條TPC-H測試查詢;叢集地址開啟HTAP优化(行存/列存自动引流),行存並行度設為8(主要用於縮短測試時間)。
測試結果:如下表所示,後續輪次的查詢速度提升非常明顯。在第一輪執行後半部分查詢時(約第12條開始),AutoIndex已完成對大多數表的列索引建立,最佳化器自動將這部分查詢路由至列存索引唯讀節點。
執行輪次 | 總時間(s) | 行存計劃/列存計劃 | 提速效果 |
1 | 8293 | 10/12 | - |
2 | 118 | 1/21 | 約70倍 |
3 | 110 | 0/22 | 約75倍 |
功能優勢
列存索引特性提供了一系列優勢,使其在相容性、效能和成本方面都有顯著提升:
100%相容MySQL:支援MySQL所有資料類型,完全相容MySQL協議。
優秀的HTAP效能:分析情境效能普遍可以達到1~2個數量級的提升。
行列混合儲存,降低成本:行列儲存保證事務一致性,列索引在某些查詢情境效能更優,成本更低。
自動提速操作簡單:一鍵開啟自動效能提升,無需複雜配置和調整。
節約營運工作量:自動為慢查詢建立列索引,減少手動慢查詢最佳化工作。
節約IT成本:無需為所有庫和表建立列索引,只針對慢查詢最佳化,節省記憶體和儲存資源。
支援版本
企業版叢集,需滿足以下條件:
系列:叢集版。
資料庫核心版本號碼:
MySQL 8.0.1,且核心小版本需為8.0.1.1.45.2及以上。
MySQL 8.0.2,且核心小版本需為8.0.2.2.27及以上。
標準版叢集,需滿足以下條件:
CPU架構:X86。
資料庫核心版本號碼:MySQL 8.0.1,且核心小版本需為8.0.1.1.45.2及以上。
如何查詢叢集版本,請參見查詢版本號碼。
注意事項
開啟自動列存索引提速
登入PolarDB控制台,在左側導覽列單擊集群列表,選擇叢集所在地區,並單擊目的地組群ID進入叢集詳情頁。
在基本信息頁面,單擊自动列存索引提速欄的開啟按鈕。
按照當前叢集是否有列存索引唯讀節點,可以分為如下兩種情況:
當前叢集已有列存索引唯讀節點時,在开启自动列存索引提速對話方塊,單擊确定,即可開啟自動列存索引提速。
當前叢集沒有列存索引唯讀節點時,在开启自动列存索引提速對話方塊,單擊确定,將跳轉至添加列存索引唯讀節點頁面。
說明您可以在單擊确定後立即添加列存索引唯讀節點,也可以後續手動添加列存索引唯讀節點。
開啟自動無感提速後,當前叢集應含有至少一個列存索引唯讀節點,否則即使自动列存索引提速為開啟狀態,也不會提供加速服務。
開啟自動無感提速後,若您未添加列存索引唯讀節點,系統會採用SQL Trace功能記錄慢SQL的歷史執行情況,但不會建立列存索引。即無法提供加速服務。
關閉自動列存索引提速
登入PolarDB控制台,在左側導覽列單擊集群列表,選擇叢集所在地區,並單擊目的地組群ID進入叢集詳情頁。
在基本信息頁面,單擊自动列存索引提速欄的關閉按鈕。
在关闭自动列存索引提速對話方塊,單擊确定,即可關閉自動列存索引提速。
關閉自動列存索引提速後,僅僅是關閉了自動列存索引提速功能的相關參數,列存索引唯讀節點及其相關資料將繼續保留。如果您不再需要保留列存索引唯讀節點或其上的列存索引,可以在控制台中刪除列存索引唯讀節點,或者通過SQL語句刪除列存索引。