使用 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。