Adding a new column is not a matter of typing ALTER TABLE and moving on. Done wrong, it locks tables, freezes writes, and sends latency through the roof. Done right, it scales cleanly and without downtime. The difference comes from execution.
Start by defining the new column with precise types. Never default to TEXT or VARCHAR(MAX) out of laziness. Every byte counts. Specify nullability with intent — NULL values have real storage and performance implications. If the column requires a default value, set it explicitly, but weigh the migration cost if the dataset is large.
On massive tables, avoid a single schema migration that rewrites every row. Use phased rollouts. Create the new column as nullable, deploy, then backfill in controlled batches. Monitor query performance. If indexes are needed, create them after the backfill to reduce write amplification.