All Products
Search
Document Center

PolarDB:DDL read-ahead

Last Updated:Sep 03, 2024

PolarDB provides the DDL read-ahead feature. It takes a very long time to execute DDL statements on large tables. You can use the DDL read-ahead feature to shorten the time required to execute DDL statements.

Prerequisites

Your PolarDB cluster must meet one of the following requirements:

  • A cluster of PolarDB for MySQL 8.0 whose revision version is 8.0.1.1.28 or later.

  • A cluster of PolarDB for MySQL 5.7 whose revision version is 5.7.1.0.22 or later.

  • A cluster of PolarDB for MySQL 5.6 whose revision version is 5.6.1.0.34 or later.

For more information about how to check the cluster version, see Query the engine version.

Precautions

After the DDL read-ahead feature is enabled, more I/O resources are occupied due to read-ahead threads. This may affect the execution of other SQL statements within the same period. Therefore, we recommend that you use the DDL read-ahead feature during off-peak hours.

Usage

  • loose_innodb_polar_ddl_build_index_readahead

    You can enable the DDL read-ahead feature by using the loose_innodb_polar_ddl_build_index_readahead parameter.

    Parameter

    Level

    Description

    loose_innodb_polar_ddl_build_index_readahead

    Global

    Specifies whether to enable the DDL read-ahead feature. Default value: OFF. Valid values:

    • ON

    • OFF

  • loose_innodb_polar_ddl_build_index_readahead_page_num

    You can set the data size to read ahead by using the loose_innodb_polar_ddl_build_index_readahead_page_num parameter.

    Parameter

    Level

    Description

    loose_innodb_polar_ddl_build_index_readahead_page_num

    Global

    The number of pages to read ahead. The data size of one page is 16K. Valid values: 32 to 256. Default value: 64.

Performance test

  • Test environment

    • A cluster of PolarDB for MySQL 8.0 that has 8 CPU cores and 32 GB memory.

    • The storage capacity of the cluster is 50 TB.

  • Schema

    Execute the following statement to create a table that is named 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;
  • Data

    Execute the following statement to generate test data:

    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) ;
  • Test method and test results

    After data is inserted, you must restart PolarDB processes to ensure that no data is cached in the buffer_pool memory. Test the improvement percentage of DDL execution efficiency by comparing time values before and after the DDL read-ahead feature is enabled.

    • Compare the DDL execution efficiency by executing the ALTER TABLE table_1 ADD INDEX name_index (seller_name); statement:

      DDL read-ahead feature

      Time consumed (seconds)

      Disabled

      485

      Enabled

      (loose_innodb_polar_ddl_build_index_readahead_page_num is set to 256)

      412

    • Compare the DDL execution efficiency by executing the ALTER TABLE table_1 ADD COLUMN c1 varchar(100) after id; statement:

      DDL read-ahead feature

      Time consumed (seconds)

      Disabled

      264

      Enabled

      (loose_innodb_polar_ddl_build_index_readahead_page_num is set to 256)

      159

Contact Us

If you have any questions about DDL operations, please feel free to Contact us.