本文匯總了與X-Engine引擎相關的常見問題。
X-Engine引擎是什麼,能解決什麼問題?
X-Engine是阿里巴巴自研的基於LSM-tree架構的儲存引擎,提供了強大的資料壓縮能力,滿足了歸檔資料庫低儲存成本的要求。通過LSM-Tree(Log-Structured Merge-Tree)層次化架構和Zstandard(ZSTD)壓縮演算法實現了更高的資料壓縮率,相較於使用InnoDB作為儲存引擎,最高可節省70%的儲存空間。相關文檔請參見高壓縮引擎(X-Engine)。
X-Engine壓縮效果怎樣?
X-Engine引擎預設開啟資料壓縮功能。一般情況下,相對於InnoDB引擎,儲存空間能壓縮到1/3至1/10,具體壓縮比例與資料特徵有關。X-Engine引擎支援通過採樣資訊來估算壓縮比,您可以結合外部資訊(如資料匯入前的資料大小)自行計算準確的壓縮率。
假設需要查詢的表在資料庫test
中,表名為test1
,來查詢表資料估算後的壓縮比。SQL語句如下:
SELECT
TABLE_NAME,
SUBTABLE_NAME,
SUM(EXTENTS*APRROX_CMP_RATIO)/SUM(EXTENTS)
FROM
INFORMATION_SCHEMA.XENGINE_SUBTABLE
WHERE TABLE_NAME = 'test.test1' AND SUBTABLE_NAME = 'PRIMARY' AND LEVEL in (1, 2);
SQL語句中XENGINE_SUBTABLE
表的Schema資訊如下表:
列名 | 說明 |
TABLE_NAME | 由資料庫名稱和表名拼接而成。如 |
SUBTABLE_NAME | 索引名稱。 |
LEVEL | 邏輯層號。 |
EXTENTS | 邏輯層使用的extent數量。 |
NUM_ENTRIES | 當前邏輯層的資料量。 |
NUM_DELETES | 邏輯層刪除的資料量。 |
APRROX_CMP_RATIO | 當前邏輯層採樣近似壓縮比。 |
SAMPLE_OUTDATED | 當前邏輯層的採樣資訊是否到期。 |
支援使用SQL語句查詢壓縮比的企業版叢集版本需要滿足以下條件之一:
PolarDB MySQL版8.0.1版本,且修訂版本為8.0.1.1.40及以上。
PolarDB MySQL版8.0.2版本,且修訂版本為8.0.2.2.22及以上。
X-Engine引擎中的表是基於LSM-Tree的索引組織表,表資料存放區在主索引中。主索引LSM-Tree分為3層,大部分資料集中在第1層和第2層,其中第0層是從記憶體直接轉儲的資料,不進行資料壓縮。因此,查詢壓縮率的SQL語句中使用
LEVEL in (1, 2)
來計算這兩層壓縮比的加權平均值,從而得到X-Engine中的表資料的壓縮比。如果要查詢某個二級索引上的資料的壓縮比,需要在SQL語句中指定
SUBTABLE_NAME
索引名稱。
大量匯入資料到X-Engine表後為什麼壓縮率較低?
X-Engine採用後台非同步壓縮技術,是在不影響業務使用的情況下,逐漸重整並壓縮資料以達到理想壓縮率。重整和後台壓縮操作一般在業務低峰期進行。因此,大量匯入後,資料存放區空間可能接近壓縮前水平,一段時間後空間將逐步釋放。
X-Engine引擎相比RocksDB引擎、TokuDB引擎如何?
X-Engine引擎壓縮率與TokuDB、RocksDB引擎壓縮率接近。目前TokuDB社區已經停滯發展,後續資料庫服務的可持久性無法保證,之前阿里雲上存量的TokuDB使用者已全部轉到X-Engine引擎。相對RocksDB引擎以及對應的myrocks產品,PolarDB高壓縮引擎(X-Engine)的核心優勢是提供了海量儲存,彈性以及線上變更schema的能力。相關文檔請參見X-Engine性價比優勢。
購買PolarDB叢集時,如何選擇使用X-Engine引擎?
PolarDB MySQL版8.0版本支援X-Engine引擎,PolarDB高壓縮引擎(X-Engine)的建立方式與PolarDB叢集建立方式一致,您只需在售賣頁選擇相容性為MySQL 8.0,且系列為高壓縮引擎(X-Engine)即可。
已經使用的PolarDB叢集,是否支援開啟X-Engine引擎?
目前PolarDB的最新版本已經支援存量PolarDB叢集開啟X-Engine引擎功能。選擇PolarDB叢集,在左側導覽列選擇配置與管理->高壓縮引擎即可。動態開啟X-Engine引擎的功能需要PolarDB MySQL版8.0版本且核心小版本需為8.0.1.1.31及以上。
如何使用X-Engine引擎表?
對於建立表,直接指定engine=xengine即可;對於存量表,可以通過ALTER語句將錶轉換為X-Engine引擎。相關文檔請參見InnoDB/TokuDB/Myrocks引擎轉換為X-Engine引擎。
X-Engine是否有相關的客戶案例?
X-Engine引擎已經支援了阿里巴巴叢集和阿里雲的大量使用者,累計資料量達到PB層級,總體執行個體數目超過3000+。客戶案例相關文檔請參見X-Engine最佳實務。
X-Engine引擎功能是否收費?
購買使用X-Engine引擎與InnoDB引擎計費規則一致,不額外單獨收費。具體來說,如果存放在InnoDB引擎的資料是100 GB,存放在X-Engine引擎時資料被壓縮為30 GB,就按照30 GB的儲存容量計費。
PolarDB(X-Engine)相對於RDS(X-Engine)優勢是什嗎?
PolarDB(X-Engine)提供了海量的儲存空間,徹底解決使用者的容量焦慮,最大支援500 TB的儲存空間,PolarDB(X-Engine)採用存算分離技術,彈性增/減唯讀節點,一份資料至多支援16個唯讀節點。PolarDB(X-Engine)採用分布式儲存,資料庫的高可用不再需要依賴Binlog複製,間接提高了寫入效能。
PolarDB MySQL版5.6/5.7版本是否支援X-Engine引擎?
不支援。
X-Engine支援事務嗎?
支援事務。
X-Engine支援OnlineDDL嗎?
支援,執行DDL變更過程中,不會阻塞其它事務的更新。
X-Engine支援並行DDL嗎?
支援。
X-Engine引擎支援行鎖嗎?
X-Engine引擎支援行粒度的並發控制,並支援死結檢測,與InnoDB引擎一致。
X-Engine引擎支援哪些隔離等級?
支援read-committed,repeatable-read隔離等級,預設的隔離等級是read-committed。
X-Engine引擎支援大事務嗎?
不支援大事務。對於大事務,內部會自動按行拆分,當一個事務修改的行數等於或大於10000行時,X-Engine會啟用commit in middle功能,即X-Engine會在內部提交該事務,並重新開啟一個子事務繼續執行該事務。
X-Engine支援分區表嗎?
支援。叢集版本需滿足以下要求:
PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.34及以上。
PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.16及以上。
該功能目前處於灰階發布階段,如果需要開啟該功能,請前往配額中心,根據配額ID
polardb_mysql_xengine_partition
找到配額名稱,在對應的操作列單擊申請來申請開通該功能。如需瞭解更多關於建立X-Engine分區表的內容,請搜尋DingTalk群號加群進行諮詢。DingTalk群號:24490017825。
X-Engine支援列索引分析嗎?
不支援。
X-Engine引擎有哪些功能限制?
X-Engine引擎是一個事務引擎,完全相容MySQL協議,具備儲存引擎常用功能,對於一些進階功能的支援還不完善,具體使用限制請參見X-Engine使用說明。
X-Engine支援不同儲存介質冷熱分離嗎?
不支援。
X-Engine支援並行查詢嗎?
目前僅PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.34及以上的版本支援並行查詢。
X-Engine引擎的效能怎樣?
X-Engine引擎採用LSM-tree組織資料,寫入友好,寫入效能強,讀能力相對較弱。X-Engine引擎預設對資料開啟壓縮,綜合效能相對於InnoDB引擎略有下降,在標準Sysbench壓測情境下,效能較InnoDB引擎下降10%-20%之間。詳情請參見PolarDB MySQL版8.0.1版本高壓縮引擎(X-Engine)與叢集版效能對比。
如何查看X-Engine引擎中的表佔用的儲存空間容量?
使用叢集主地址串連資料庫叢集,根據需要查詢的庫名和表名在XENGINE_SUBTABLE
表中查詢該表對應的TABLE_SPACE_ID
,並通過查詢到的TABLE_SPACE_ID
在INFORMATION_SCHEMA的XENGINE_TABLE_SPACE
表中查看該表已使用的extent數量,再根據extent數量計算出該表佔用的儲存空間容量。
單個extent佔用的儲存空間容量為2 MB。
假設要查詢的表所在的資料庫為test
,表名為test1
,則查詢表佔用的儲存空間容量的SQL語句如下:
SELECT
SUM(TOTAL_EXTENT_COUNT)/512 AS SIZE_GB,
SUM(USED_EXTENT_COUNT)/512 AS USED_SIZE_GB,
SUM(FREE_EXTENT_COUNT)/512 AS FREE_SIZE_GB
FROM
INFORMATION_SCHEMA.XENGINE_TABLE_SPACE
WHERE TABLE_SPACE_ID IN (
SELECT TABLE_SPACE_ID
FROM
INFORMATION_SCHEMA.XENGINE_SUBTABLE
WHERE TABLE_NAME = 'test.test1');
其中,XENGINE_TABLE_SPACE
是以檔案視角來統計儲存空間容量。該表中與空間相關的列及其說明如下:
列名 | 說明 |
TABLE_SPACE_ID | 資料表空間的ID。 說明 您可以在 |
TOTAL_EXTENT_COUNT | 總extent數量。 |
USED_EXTENT_COUNT | 已使用的extent數量。 |
FREE_EXTENT_COUNT | 空閑extent數量。 |
XENGINE_SUBTABLE
是以LSM各個層的角度來統計儲存空間容量。該表中的列及其說明如下:
列名 | 說明 |
TABLE_NAME | 資料庫名和表名的拼接。如資料庫名為 |
SUBTABLE_NAME | 索引名。 |
SUBTABLE_ID | 索引ID。 |
TABLE_SPACE_ID | 索引對應的table space ID。 |
LEVEL | 邏輯層號。 |
LAYER | 邏輯層中的物理層。 說明 level 0可能存在多個物理層,level1和level2隻有一個物理層。 |
EXTENTS | 該層使用的extent數量。 |