使用 longblob 将列添加到大 table 的最佳方法
Best way to add column to a big table with longblob
我有以下 table:
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 行。我需要向此 table 添加一个新列,但这需要很长时间,超过 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;
但是它们也很慢..有更好的方法吗?
谢谢
您现在所做的 ALTER TABLE
是据我所知最好的方法。当没有太多事务(或)数据库操作正在进行时,您可以尝试进行此更改。我的意思是说,在空闲时间进行更改。
ALTER TABLE PDF_STORAGE ADD VERSION INT NOT NULL DEFAULT '0' AFTER LINK_FILE ;
您还可以创建一个与此 table 架构相同的新 table 架构以及新列。
将此table中的所有记录插入到新创建的table中。
将新 table 重命名为旧 table 名称。
删除旧的table。
我有以下 table:
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 行。我需要向此 table 添加一个新列,但这需要很长时间,超过 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;
但是它们也很慢..有更好的方法吗?
谢谢
您现在所做的 ALTER TABLE
是据我所知最好的方法。当没有太多事务(或)数据库操作正在进行时,您可以尝试进行此更改。我的意思是说,在空闲时间进行更改。
ALTER TABLE PDF_STORAGE ADD VERSION INT NOT NULL DEFAULT '0' AFTER LINK_FILE ;
您还可以创建一个与此 table 架构相同的新 table 架构以及新列。
将此table中的所有记录插入到新创建的table中。
将新 table 重命名为旧 table 名称。
删除旧的table。