PolarDB は、バッファープール内のデータページをクリーンアップするメカニズムを最適化します。これにより、MySQL Community Edition における 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=<cluster_endpoint> user=<database_account> psw=<database_password> port=<database_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を作成し、それぞれに 8,192 行と 2,097,152 行のデータを挿入します。# t1 テーブルを作成し、8,192 行のデータを挿入します。 row_num=13 ip=<cluster_endpoint> user=<database_account> psw=<database_password> port=<database_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=<cluster_endpoint> user=<database_account> psw=<database_password> port=<database_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 操作についてご質問がある場合は、「お問い合わせ」をご利用ください。