日常運維中頻繁需要「復制表」。本文給出四大標準場景的最簡 SQL,對比 CREATE TABLE ... LIKE、CREATE TABLE ... SELECT、INSERT ... SELECT 的適用邊界與性能差異。
-- 方法 1:LIKE(最快,僅複製定義、索引、約束,不複製觸發器/外鍵) CREATE TABLE new_tbl LIKE old_tbl; -- 方法 2:WHERE 1=2(通用,可跨庫,不複製外鍵/觸發器) CREATE TABLE new_tbl SELECT * FROM old_tbl WHERE 1=2;
LIKE 保留原表所有索引、約束、默認值、字符集;SELECT WHERE 1=2 僅保留列定義,**不保留索引/主鍵/自增/外鍵**,需手動補充。CREATE TABLE db2.new_tbl LIKE db1.old_tbl;CREATE TABLE new_tbl SELECT * FROM old_tbl;
pt-archiver。INSERT INTO target_tbl SELECT * FROM source_tbl;
INSERT INTO target_tbl SELECT * FROM source_tbl WHERE id BETWEEN 1 AND 10000; 循環執行,避免長事務。INSERT INTO target_tbl (col_a, col_b, col_c) SELECT src_x, src_y, src_z FROM source_tbl WHERE create_time > '2024-01-01';
CAST)。| 語句 | 鎖源表 | Binlog 量 | 保留索引/約束 | 適用場景 |
|---|---|---|---|---|
| CREATE ... LIKE | 無(僅元數據) | 極小 | 全保留 | 建空表、Schema 同步 |
| CREATE ... SELECT | 共享讀鎖 (MyISAM) / 行鎖 (InnoDB) | 大(全量行) | 不保留 | 小表全量複製、建測試表 |
| INSERT ... SELECT | 行鎖 (InnoDB) | 大 | 目標表自有 | 同結構遷移、歷史歸檔 |
LIKE,再 ALTER TABLE 補索引/分區,最後分批 INSERT ... SELECT 導數據。pt-online-schema-change 或 gh-ost** 在線無鎖遷移,業務零感知。mysqldump -d 導結構,mysqldump -t 導數據,或用 mysqlpump 並行導出。選對語句,避免「建表快但無索引導致全表掃」、「導數據快但長鎖表導致業務卡頓」。