INSTANT DDL migrations

MySQL's INSTANT DDL is accessible in both unmanaged and managed vitess migrations.

INSTANT DDL refers to ALTER TABLE ... ALGORITHM=INSTANT which runs near-instantaneously, though some locking is still witnessed in heavy workloads. It is limited to a subset of operations. The documentation lists the general limitations but does not cover the precise range of scenarios.

A common naive approach to using INSTANT DDL is to optimistically attempt an ALTER TABLE ... ALGORITHM=INSTANT, and if that turns to be unsupported by INSTANT DDL, resort to standard ALTER TABLE.

INSTANT DDL in unmanaged schema changes #

A user may thus submit an ALTER TABLE ... ALGORITHM=INSTANT migration via ApplySchema with direct or mysql strategies, or plainly from their VTGate connection.

INSTANT DDL in managed schema changes #

With the vitess strategy, Vitess always prefers an Online DDL migration, which then allows revertibility. However, the --prefer-instant-ddl DDL strategy flag suggests to Vitess that, where possible, it should use INSTANT DDL.

Vitess can predict whether a schema change is eligible to INSTANT DDL based on the existing table schema and the requested change. It is aware of the MySQL limitations (some of which are listed in the documentation) and can devise a plan for each distinct migration. If eligible for INSTANT DDL, and if --prefer-instant-ddl is specified, Vitess will automatically add ALGORITHM=INSTANT to the statement. Otherwise any ALGORITHM directive is ignored.

If chosen to run as INSTANT DDL, the migration has no shadow table and is not revertible.

Example #


mysql> set @@ddl_strategy='vitess --prefer-instant-ddl';

-- The migration is tracked, but the ALTER process won't start running.
mysql> alter table corder add column name varchar(32);
+--------------------------------------+
| uuid                                 |
+--------------------------------------+
| f0070c6e_abe1_11ef_a809_b27afeff3c85 |
+--------------------------------------+

Migrations executed with --prefer-instant-ddl are visible on show vitess_migrations just like any other migration:

mysql> show vitess_migrations like 'f0070c6e_abe1_11ef_a809_b27afeff3c85' \G
*************************** 1. row ***************************
                             id: 1
                 migration_uuid: f0070c6e_abe1_11ef_a809_b27afeff3c85
                       keyspace: commerce
                          shard: 0
                   mysql_schema: vt_commerce
                    mysql_table: corder
            migration_statement: alter table corder add column `name` varchar(32)
                       strategy: vitess
                        options: --prefer-instant-ddl
                added_timestamp: 2024-11-26 12:33:55
            requested_timestamp: 2024-11-26 12:33:55
                ready_timestamp: NULL
              started_timestamp: 2024-11-26 12:33:57
             liveness_timestamp: 2024-11-26 12:33:57
            completed_timestamp: 2024-11-26 12:33:56.652159
              cleanup_timestamp: NULL
               migration_status: complete
                       log_path:
                      artifacts:
                        retries: 0
                         tablet: zone1-0000000101
                 tablet_failure: 0
                       progress: 100
              migration_context: vtgate:e1131b44-abe1-11ef-a809-b27afeff3c85
                     ddl_action: alter
                        message:
...
                   special_plan: {"operation":"instant-ddl"}

Note the migration has no artifacts, and that it is executed with special_plan: {"operation":"instant-ddl"}.

PARTITIONING notes #

MySQL partitioning changes sometimes exhibit behaviors similar to INSTANT DDL, although partition management really operates on entire hidden tables.

Vitess specifically addresses the common use case of RANGE partitioned tables and partition rotation.

The operation ALTER TABLE ... ADD PARTITION creates a new empty hidden table, which implements the new partition. The operation is as fast as CREATE TABLE. It is wasteful to run this operation with Online DDL because the existing data is completely unaffected. Vitess always opts to run ADD PARTITION directly against MySQL, much like an INSTANT DDL, and the operation is not revertible. This behavior is not controlled by any flags.

The operation ALTER TABLE ... DROP PARTITION drops one or more partitions, hence effectively drops one or more tables imlementing those partitions. It would be a logical error to run this operation with Online DDL, because the intended outcome is to drop rows of data, where an Online DDL operation would just copy those rows of data onto the next compatible partition. Vitess thus always opts to run DROP PARTITION directly against MySQL, and the operation is not revertible. This behavior is likewise not controlled by any flags.

Vitess does not offer any special behavior for other types of partitioning schemes and operations.