MySQLコミュニティ5.7でTRUNCATE TABLEステートメントとDROP TABLEステートメントを実行すると、バッファプール全体がスキャンされ、テーブルスペースに対応するすべてのデータページがLRUリストとFLUSHリストから削除されます。 バッファプールが非常に大きい場合、このプロセスには長い時間がかかります。 PolarDBは、DDLステートメントのバッファプール管理メカニズムを最適化して、バッファプールのスキャン効率と、TRUNCATE TABLEおよびDROP TABLEステートメントの実行効率を向上させます。
制限事項
リビジョンバージョンが5.7.1.0.21以降のPolarDB for MySQL 5.7クラスター。
説明 バージョンの確認方法の詳細については、「エンジンバージョンの照会」をご参照ください。
Usage
loose_innodb_flush_pages_using_space_idパラメーターを指定することで、より高速なTRUNCATE/DROP TABLE機能を有効にできます。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。 次の表にパラメーターを示します。
パラメーター | レベル | 説明 |
loose_innodb_flush_pages_using_space_id | グローバル | 高速truncate/DROP TABLE機能を有効にするかどうかを指定します。 デフォルト値: OFF。 有効な値:
|
性能テスト
TRUNCATE TABLEステートメントは、異なる仕様のクラスター内のテーブルに対するTRUNCATE TABLEステートメントの実行効率に対する、より高速なTRUNCATE/DROP TABLE機能の有効化と無効化の影響を比較するためにテストで使用されます。
テスト方法
- 次のコマンドを実行して、異なる仕様のクラスターのバッファプールを使い果たし、TRUNCATE TABLEステートメント
の実行効率に影響を与えないようにします。ip=xxx.xxx.xx.xx user='user_name' psw='password' port=xxx MYSQL="mysql -- host=$ip -p$psw -- port=$port -u$user -vvv -e" $MYSQL「データベーステストの作成」 $MYSQL "test" use test;create table if exists t3 (a bigint,b char(250),c char(250),d char(250),e char(250)) charset=latin1;" $MYSQL "テストを使用します。t3値に挿入します (1、リピート ('x', 255) 、リピート ('x', 255) 、リピート ('x', 255) 、リピート ('x', 255));" for (((i=1; i<=32; i +=1))) 行う $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 t1;"
- TRUNCATE TABLE文を実行する
t1
テーブルとt2
テーブルを作成し、t1テーブルとt2テーブルに8196行と2097152行のデータを挿入します。# t1テーブルを作成し、8,196行のデータを挿入します。 row_num=13 ip=xxx.xxx.xx.xx user='user_name' psw='password' port=xxx MYSQL="mysql -- host=$ip -p$psw -- port=$port -u$user -vvv -e" $MYSQL "test" use test;create table if exists t1 (a bigint,b char(250),c char(250),d char(250),e char(250)) charset=latin1;" $MYSQL "test" を使用します。t1値に挿入します (1,repeat('x', 255),repeat('x', 255),repeat('x', 255),repeat('x', 255));" for (((i=1; i <=$ row_num; i +=1)) 行う $MYSQL "test;insert into t1 select * from t1;" done
# t2テーブルを作成し、2,097,152行のデータを挿入します。 row_num=21 ip=xxx.xxx.xx.xx user='user_name' psw='password' port=xxx MYSQL="mysql -- host=$ip -p$psw -- port=$port -u$user -vvv -e" $MYSQL "test" use test;create table if exists t2 (a bigint,b char(250),c char(250),d char(250),e char(250)) charset=latin1;" $MYSQL "test" を使用します。t2値に挿入します (1,repeat('x', 255),repeat('x', 255),repeat('x', 255),repeat('x', 255));" for (((i=1; i <=$ row_num; i +=1)) 行う $MYSQL "test;insert into t2 select * from t2;" 完了
- 異なる仕様のクラスターの場合、より高速なTRUNCATE/DROP TABLE機能を有効または無効にし、
t1
テーブルとt2
テーブルでTRUNCATE TABLEステートメントを実行します。
テスト結果
異なる仕様のクラスターの場合、より高速なTRUNCATE/DROP TABLE機能が有効または無効になった後、t1
およびt2
テーブルでTRUNCATE TABLEステートメントを実行するのに必要な実行時間 (秒) を記録します。 次の表にテスト結果を示します。
クラスター仕様 | バッファプール (GB) | t1 | t2 | ||||
オン | オフ | 改善率 | オン | オフ | 改善率 | ||
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% | 13.8 | 1.86 | 93.55% |
8コアと64 GBのメモリ | 42 | 0.01 | 0.73 | 98.63% | 13.8 | 0.79 | 84.81% |
4 vCPUと32 GiBのメモリ | 24 | 0.02 | 0.45 | 95.56% | 0.13 | 0.53 | 75.47% |
4コアと16 GBのメモリ | 12 | 0.03 | 0.23 | 86.96% | 13.8 | 0.35 | 65.71% |
上記の表は、より高速なTRUNCATE/DROP table機能を有効にすると、TRUNCATE TABLEステートメントの実行効率が大幅に向上することを示しています。