使用longblob将列添加到大表的最佳方法

时间:2015-08-31 14:56:03

标签: mysql phpmyadmin

我有下表:

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;

但它们也很慢..有更好的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

您现在正在做的事情ALTER TABLE是我所知道的最佳方法。当没有太多事务(或)数据库操作正在进行时,您可以尝试进行此更改。我的意思是说,做空闲时间的变化。

ALTER TABLE  PDF_STORAGE ADD  VERSION INT NOT NULL DEFAULT  '0' AFTER  LINK_FILE ;

您也可以创建一个与此表模式相同的新表以及新列。

将此表中的所有记录插入新创建的表中。

将新表重命名为旧表名。

删除旧表。