すべてのプロダクト
Search
ドキュメントセンター

PolarDB:より高速なトランケート /ドロップテーブル

最終更新日:May 29, 2024

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。 有効な値:
  • ON
  • オフ

性能テスト

TRUNCATE TABLEステートメントは、異なる仕様のクラスター内のテーブルに対するTRUNCATE TABLEステートメントの実行効率に対する、より高速なTRUNCATE/DROP TABLE機能の有効化と無効化の影響を比較するためにテストで使用されます。

テスト方法
  1. 次のコマンドを実行して、異なる仕様のクラスターのバッファプールを使い果たし、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;" 
  2. 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;"
    完了 
  3. 異なる仕様のクラスターの場合、より高速なTRUNCATE/DROP TABLE機能を有効または無効にし、t1テーブルとt2テーブルでTRUNCATE TABLEステートメントを実行します。

テスト結果

異なる仕様のクラスターの場合、より高速なTRUNCATE/DROP TABLE機能が有効または無効になった後、t1およびt2テーブルでTRUNCATE TABLEステートメントを実行するのに必要な実行時間 (秒) を記録します。 次の表にテスト結果を示します。

クラスター仕様バッファプール (GB)t1t2
オンオフ改善率オンオフ改善率
64コア、512 GBのメモリ3740.015.299.81%0.119.4898.84%
32コア、256 GBのメモリ 192 0.022.4599.18%0.12.6596.23%
16コアと128 GBのメモリ960.011.7399.42%13.81.8693.55%
8コアと64 GBのメモリ420.010.7398.63%13.80.7984.81%
4 vCPUと32 GiBのメモリ240.020.4595.56% 0.13 0.5375.47%
4コアと16 GBのメモリ120.030.2386.96%13.80.3565.71%

上記の表は、より高速なTRUNCATE/DROP table機能を有効にすると、TRUNCATE TABLEステートメントの実行効率が大幅に向上することを示しています。