我有下表:
CREATE TABLE IF NOT EXISTS PDF_STORAGE (
ID_PDF_STORAGE bigint(20) NOT NULL AUTO_INCREMENT,
DESC_FILE varchar(255) DEFAULT NULL,
PDF_FILE longblob,
LINK_FILE varchar(255) DEFAULT NULL,
VERSION int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (ID_PDF_STORAGE)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
其中PDF_FILE
平均为10 MB的文件。今天它有大约50.000行。我需要在此表中添加一个新列但是需要花费很长时间,超过10分钟,有时会在PhpMyAdmin中出现401错误,因此我想知道实现此目的的正确方法是什么。 ..
我已经尝试过:
ALTER TABLE PDF_STORAGE ADD VERSION INT NOT NULL DEFAULT '0' AFTER LINK_FILE ;
和
SET FOREIGN_KEY_CHECKS=0;
CREATE TABLE PDF_STORAGE_new LIKE PDF_STORAGE;
ALTER TABLE PDF_STORAGE_new ADD VERSION INT NOT NULL DEFAULT '0' AFTER LINK_FILE ;
INSERT INTO PDF_STORAGE_new (PDF_STORAGE, DESC_FILE, ID_PDF_STORAGE, LINK_FILE) SELECT * FROM PDF_STORAGE;
RENAME TABLE PDF_STORAGE TO PDF_STORAGE_old, PDF_STORAGE_new TO PDF_STORAGE;
DROP TABLE PDF_STORAGE_old;
SET FOREIGN_KEY_CHECKS = 1;
但它们也很慢..有更好的方法吗?
由于
答案 0 :(得分:0)
您现在正在做的事情ALTER TABLE
是我所知道的最佳方法。当没有太多事务(或)数据库操作正在进行时,您可以尝试进行此更改。我的意思是说,做空闲时间的变化。
ALTER TABLE PDF_STORAGE ADD VERSION INT NOT NULL DEFAULT '0' AFTER LINK_FILE ;
您也可以创建一个与此表模式相同的新表以及新列。
将此表中的所有记录插入新创建的表中。
将新表重命名为旧表名。
删除旧表。