全部產品
Search
文件中心

PolarDB:DDL IO效能最佳化

更新時間:Feb 09, 2025

本文對DDL IO效能最佳化進行了整體介紹。

PolarDB是計算與儲存分離的技術架構,計算節點通過高效能RDMA訪問分布式儲存,但分布式儲存的訪問延遲依然明顯高於本地碟的訪問延遲。在大表DDL情境中,DDL操作會觸發大量的IO操作,因此分布式儲存的額外延遲對DDL會有一定的效能影響。針對這類問題,PolarDB在DDL IO路徑上主要實現了以下功能:

  • DDL預讀:DDL在構建索引過程中開啟預讀線程,減少IO讀延遲。

  • DDL非同步IO:DDL在寫入資料時開啟後台寫線程,減少IO寫延遲;

  • DDL多路歸併排序:減少DDL過程中的IO次數,降低IO延遲的影響。

效能測試

  • 測試環境

    • 一個規格為8核32 GB的PolarDB MySQL版8.0版本的叢集。

    • 叢集儲存空間為50 TB。

  • 測試表結構

    通過如下語句建立一張名為table_1的表:

    CREATE TABLE `table_1` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `seller_id` bigint(20) DEFAULT NULL,
    `seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
    `gmt_create` varchar(30) DEFAULT NULL,
    `update_time` varchar(30) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB;
  • 測試表資料

    通過如下語句產生測試資料:

    delimiter ||
    CREATE PROCEDURE populate_0(IN NUM INT)
    BEGIN
    DECLARE sid INT;
    DECLARE suffix_name INT;
    DECLARE i INT;
    SET sid=1000;
    SET suffix_name=10;
    SET i=1;
    START TRANSACTION;
    WHILE i <= NUM
    DO
    INSERT INTO table_1(seller_id,seller_name,gmt_create,update_time) VALUES(sid,CONCAT('sellername',suffix_name),NOW(),NOW());
    SET suffix_name=suffix_name+1;
    SET sid=sid+1;
    SET i=i+1;
    END WHILE;
    COMMIT;
    END ||
    delimiter ;
    CALL populate_0(100000000) ;
  • 測試方法及結果

    資料插入完成以後,通過執行alter table table_1 add index name_index (seller_name);來進行DDL執行效率的對比:

    DDL預讀、非同步IO、多路歸併排序功能開啟情況

    耗時(秒)

    開啟DDL預讀、非同步IO、多路歸併排序功能:

    • loose_innodb_polar_ddl_build_index_readahead=ON

    • loose_innodb_polar_ddl_build_index_readahead_page_num=256

    • innodb_polar_ddl_async_io=ON

    • innodb_polar_parallel_merge_ways=8

    252

    關閉DDL預讀、非同步IO、多路歸併排序功能:

    • loose_innodb_polar_ddl_build_index_readahead=OFF

    • loose_innodb_polar_ddl_build_index_readahead_page_num=64

    • innodb_polar_ddl_async_io=OFF

    • innodb_polar_parallel_merge_ways=2

    485