簡體   English   中英

有關ALTER TABLE ADD COLUMN的性能問題

[英]Performance concerns regarding ALTER TABLE ADD COLUMN

我有一個擁有500萬行的MySQL InnoDB大表。 我需要在表中添加一列,該列將具有默認的int值。

最好的方法是什么? 正常的alter table命令似乎要花費很多時間。 有什么更好的方法嗎? 基本上,我想知道是否有更快的方法或有效的方法。

並且,如果表具有外鍵引用,除了alter table之外,還有其他方法可以做到這一點嗎?

任何幫助表示贊賞。

我不會說這是一種更好的方法,但是...您可以為新數據創建一個單獨的表,並將其設置為與現有表的外鍵關系。 那將是“快速的”,但是如果數據確實屬於主表,並且每個(或大多數)現有記錄都將有一個值,那么您應該更改表並將其添加。

假設表如下所示:

CREATE TABLE mytable
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(25),
    PRIMARY KEY (id),
    KEY name (name)
);

並且您想添加一個年齡列

ALTER TABLE mytable ADD COLUMN age INT NOT NULL DEFAULT 0;

您可以分階段執行ALTER TABLE ,如下所示:

CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytablenew ADD COLUMN age INT NOT NULL DEFAULT 0;
INSERT INTO mytablenew SELECT id,name FROM mytable;
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;

如果mytable使用MyISAM存儲引擎並具有非唯一索引,請再添加兩行

CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytablenew ADD COLUMN address VARCHAR(50);
ALTER TABLE mytablenew DISABLE KEYS;
INSERT INTO mytablenew SELECT id,name FROM mytable;
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
ALTER TABLE mytable ENABLE KEYS;

這將使您看到每個階段花費多少秒。 從這里,您可以決定一個簡單的ALTER TABLE是否更好。

如果有外鍵引用,則此技術會有點麻煩。

您的步驟將是

  • SET UNIQUE_CHECKS = 0;
  • SET FOREIGN_KEY_CHECKS = 0;
  • 將外鍵引用放在mytable
  • 分階段執行ALTER TABLE
  • mytable創建外鍵引用。
  • SET UNIQUE_CHECKS = 1;
  • SET FOREIGN_KEY_CHECKS = 1;

試試看 !!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM