PolarDB は、バッファープール内のデータページのクリーンアップメカニズムを最適化することで、コミュニティ版 MySQL における TRUNCATE TABLE や DROP TABLE などのデータ定義言語 (DDL) 操作のパフォーマンスが遅い問題に対処します。この最適化により、フルスキャンに起因するパフォーマンスボトルネックが回避されます。大容量のメモリを持つ、または高負荷のクラスターでは、この機能により DDL 操作の実行時間が大幅に短縮され、システムのパフォーマンスと安定性が向上します。
制限事項
お使いの PolarDB for MySQL クラスターは、次のいずれかの要件を満たす必要があります:
MySQL 5.7、リビジョンバージョン 5.7.1.0.19 以降。
MySQL 8.0.1、リビジョンバージョン 8.0.1.1.50 以降。
MySQL 8.0.2、リビジョンバージョン 8.0.2.2.30.1 以降。
クラスターのリビジョンバージョンを確認するには、PolarDB for MySQL の「バージョンガイド」をご参照ください。
使用方法
loose_innodb_flush_pages_using_space_id パラメーターを設定することで、高速な TRUNCATE/DROP TABLE 機能を有効にできます。詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。次の表にパラメーターを示します。
パラメーター | レベル | 説明 |
loose_innodb_flush_pages_using_space_id | グローバル | 高速な TRUNCATE/DROP TABLE 機能のスイッチです。有効な値:
|
パフォーマンステスト
このテストでは、MySQL 5.7 を使用して、高速な TRUNCATE/DROP TABLE 機能を有効にした場合と無効にした場合で、仕様の異なるクラスターでの TRUNCATE TABLE 操作のパフォーマンスを比較します。
テスト方法
次のコマンドを実行して、仕様の異なるクラスターのバッファープールを埋めます。このステップにより、バッファープールのステータスが TRUNCATE TABLE 操作のパフォーマンスに影響を与えないようにします。
ip=<クラスターのエンドポイント> user=<データベースアカウント> psw=<データベースのパスワード> port=<データベースのポート> MYSQL="mysql -h $ip -P $port -u$user -p$psw -vvv -e" $MYSQL "create database test;" $MYSQL "use test;create table if not exists t3 (a bigint,b char(250),c char(250),d char(250),e char(250)) charset=latin1;" $MYSQL "use test;insert into t3 values(1,repeat('x', 255),repeat('x', 255),repeat('x', 255),repeat('x', 255));" for ((i=1; i<=32; i+=1)) do $MYSQL --host=$ip -p$psw --port=$port -u$user -vvv -e "use test;insert into t3 select * from t3;" done $MYSQL "use test; select count(*) from t3;"t1 と t2 の 2 つのテーブルを作成します。
t1に 8,192 行のデータを挿入し、t2に 2,097,152 行のデータを挿入します。# t1 テーブルを作成し、8,192 行のデータを挿入します。 row_num=13 ip=<クラスターのエンドポイント> user=<データベースアカウント> psw=<データベースのパスワード> port=<データベースのポート> MYSQL="mysql -h $ip -P $port -u$user -p$psw -vvv -e" $MYSQL "use test;create table if not exists t1 (a bigint,b char(250),c char(250),d char(250),e char(250)) charset=latin1;" $MYSQL "use test;insert into t1 values(1,repeat('x', 255),repeat('x', 255),repeat('x', 255),repeat('x', 255));" for ((i=1; i<=$row_num; i+=1)) do $MYSQL "use test;insert into t1 select * from t1;" done# t2 テーブルを作成し、2,097,152 行のデータを挿入します。 row_num=21 ip=<クラスターのエンドポイント> user=<データベースアカウント> psw=<データベースのパスワード> port=<データベースのポート> MYSQL="mysql -h $ip -P $port -u$user -p$psw -vvv -e" $MYSQL "use test;create table if not exists t2 (a bigint,b char(250),c char(250),d char(250),e char(250)) charset=latin1;" $MYSQL "use test;insert into t2 values(1,repeat('x', 255),repeat('x', 255),repeat('x', 255),repeat('x', 255));" for ((i=1; i<=$row_num; i+=1)) do $MYSQL "use test;insert into t2 select * from t2;" done仕様の異なるクラスターで、高速な TRUNCATE/DROP TABLE 機能を有効にした場合と無効にした場合で、テーブル
t1とt2に対して TRUNCATE TABLE 操作を実行します。
テスト結果
高速な TRUNCATE/DROP TABLE 機能を有効にした場合と無効にした場合で、仕様の異なるクラスターでテーブル t1 と t2 に対する TRUNCATE TABLE 操作の実行時間を記録しました。結果を次の表に示します:
クラスターの仕様 | バッファープール (GB) | t1 | t2 | ||||
ON (秒) | OFF (秒) | 改善率 | ON (秒) | OFF (秒) | 改善率 | ||
64 コア, 512 GB | 374 | 0.01 | 5.2 | 99.81% | 0.11 | 9.48 | 98.84% |
32 コア, 256 GB | 192 | 0.02 | 2.45 | 99.18% | 0.1 | 2.65 | 96.23% |
16 コア, 128 GB | 96 | 0.01 | 1.73 | 99.42% | 0.12 | 1.86 | 93.55% |
8 コア, 64 GB | 42 | 0.01 | 0.73 | 98.63% | 0.12 | 0.79 | 84.81% |
4 コア, 32 GB | 24 | 0.02 | 0.45 | 95.56% | 0.13 | 0.53 | 75.47% |
4 コア, 16 GB | 12 | 0.03 | 0.23 | 86.96% | 0.12 | 0.35 | 65.71% |
この表は、高速な TRUNCATE/DROP TABLE 機能を有効にすると、TRUNCATE TABLE 操作のパフォーマンスが大幅に向上することを示しています。
お問い合わせ
DDL 操作についてご質問がある場合は、テクニカルサポートにお問い合わせください。