この記事は、MySQL Advent Calendar 2021 25 日目のエントリです。
昨日(24 日目)は meijik さんの TRUNCATE TABLEの実装とDELETE FROM でした。
しばらく触っていなかった Alibaba Cloud の PolarDB MySQL 8.0 互換版ですが、触っていないうちに(1 年以上前ですが)アーカイブ用の X-Engine が追加されていたので、今さらですがちょっとだけ触れてみました。
PolarDB(MySQL 8.0)X-Engine とは
LSM-tree と ZSTD データ圧縮アルゴリズムを使い、データ容量を圧縮保存するストレージエンジンです。
このストレージエンジンを使うと、最大 200TB までデータを保存することができます。
X-Engine を有効にして PolarDB を起動する
**「アーカイブデータベース(高圧縮率)」**を選択して起動します。
起動したらホワイトリスト(またはセキュリティグループ)を設定し、
アカウント(データベースの管理ユーザ)を登録します。
※「admin」など既に予約されているアカウント名は登録できません(半ばネタ化していますが「aurora」さんも(中に居るので)使えません)。
DB に接続してみる
ECS(AWS でいうところの EC2)から接続してみます。
# mysql -u polaradmin -h pc-0iwz7qwh279194m8k.mysql.polardb.japan.rds.aliyuncs.com -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1110
Server version: 8.0.13 Source distribution
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 8.0.13 |
+-----------+
1 row in set (0.00 sec)
リリース当初からベースのバージョンは 8.0.13 です(なおプレビューで Hash join に対応した 8.0.18 をベースにしたバージョンも使える模様。プレビューのまま長期間更新されていないように見えますが)。
データベースエンジン一覧を見てみます。
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| XENGINE | DEFAULT | X-Engine storage engine | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
10 rows in set (0.01 sec)
**XENGINE
**が入っています。
また、「アーカイブデータベース(高圧縮率)」を選択して起動した場合でも InnoDB
が併用できるようですね。
SHOW ENGINE XENGINE STATUS
を見てみます。
mysql> SHOW ENGINE XENGINE STATUS\G
*************************** 1. row ***************************
Type: DBSTATS
Name: xengine
Status:
** DB Stats **
Uptime(secs): 1197.8 total, 67.9 interval
Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s
Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s
Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent
Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s
Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 MB, 0.00 MB/s
Interval stall: 00:00:0.000 H:M:S, 0.0 percent
*************************** 2. row ***************************
Type: Memory_Stats
Name: xengine
Status:
ActiveMemTableTotalNumber: 0
ActiveMemTableTotalMemoryAllocated: 0
ActiveMemTableTotalUsed: 0
UnflushedImmTableTotalNumber: 0
UnflushedImmTableTotalMemoryAllocated: 0
UnflushedImmTableTotalMemoryUsed: 0
TableReaderTotalNumber: 0
TableReaderTotalMemoryUsed: 0
BlockCacheTotalPinnedMemory: 0
BlockCacheTotalMemoryUsed: 65
DBTotalMemoryAllocated: 65
2 rows in set (0.00 sec)
詳しいことは分かりませんが、何か出てきました。
mysqlslap
で軽くベンチマークを走らせてみる
というわけで、このインスタンスでmysqlslap
を使って、InnoDB と X-Engine を比較してみます。
こちらで使ったのと同じ 5 パターンで負荷を掛けてみました。
パターン
-
(1)
mixed
(混合)
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=150 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=mixed -u 【管理ユーザ名】 -h 【エンドポイント】 -p
※X-Engine に対しては--engine=xengine
を追加。以降同じ。
-
(2)
read
(テーブルスキャン)
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=150 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=read -u 【管理ユーザ名】 -h 【エンドポイント】 -p
-
(3)
key
(主キーで読み取り)
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=150 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=key -u 【管理ユーザ名】 -h 【エンドポイント】 -p
-
(4)
write
(挿入)
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=150 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=write -u 【管理ユーザ名】 -h 【エンドポイント】 -p
-
(5)
update
(主キーで更新)
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=150 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=update -u 【管理ユーザ名】 -h 【エンドポイント】 -p
結果
DB Engine | (1) mixed | (2) read | (3) key | (4) write | (5) update |
---|---|---|---|---|---|
InnoDB | 25.000 | 66.701 | 11.358 | 33.190 | 35.949 |
X-Engine | 52.836 | 66.865 | 11.092 | 84.626 | 89.650 |
※数値は 3 回実行した平均。単位は秒。
書き込みが含まれる (1)・(4)・(5) で倍以上の時間が掛かった一方で、読み取りのみの (2)・(3) では InnoDB と変わらないようです。
バッファプールサイズを超えるデータの読み取りが発生するケースを試していないので断定はできませんが、アーカイブ目的以外にも、書き込み頻度が低いか、書き込みを非同期に処理可能なアプリケーションに使えるかもしれませんね。