本文匯總了與X-Engine引擎相關的常見問題。關于更多高壓縮引擎X-Engine的使用問題和RDS X-Engine遷移至PolarDB X-Engine問題請進釘釘群咨詢,群號:24490017825。
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分區表的內容,請搜索釘釘群號加群進行咨詢。釘釘群號: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數量。 |