文章目錄
- 1. Online DDL (MySQL 5.6+)
- 2. pt-online-schema-change 工具
- 3. gh-ost 工具
- 4. 對于MySQL 8.0+
- 注意事項
在MySQL中創建大型表索引時,傳統方式會阻塞表的寫操作,影響生產環境使用。以下是幾種非阻塞創建索引的方法:
1. Online DDL (MySQL 5.6+)
從MySQL 5.6開始,InnoDB支持在線DDL操作:
ALTER TABLE table_name ADD INDEX index_name (column_name), ALGORITHM=INPLACE, LOCK=NONE;
ALGORITHM=INPLACE
:使用就地算法,避免表復制LOCK=NONE
:不獲取鎖,允許并發DML操作
2. pt-online-schema-change 工具
Percona提供的工具,通過創建影子表實現:
pt-online-schema-change --alter "ADD INDEX idx_name (column)" D=database,t=table --execute
3. gh-ost 工具
GitHub開源的在線模式變更工具:
gh-ost \
--database="database" \
--table="table" \
--alter="ADD INDEX idx_name (column)" \
--execute
4. 對于MySQL 8.0+
MySQL 8.0增強了在線DDL功能,默認情況下許多索引操作已經是非阻塞的:
ALTER TABLE table_name ADD INDEX index_name (column_name);
注意事項
- 在線DDL操作會消耗更多資源且執行時間更長
- 某些操作仍需要短暫的元數據鎖(如添加全文索引)
- 空間需求:在線操作通常需要額外的臨時空間
- 主鍵操作通常無法完全在線執行
對于大型生產表,建議在低峰期執行,并使用工具監控進度和影響。