【发布时间】:2015-03-05 12:42:43
【问题描述】:
我正在构建一个 MySQL 帐户数据库。我有一个从 json 文件导入整个数据库的例程。该例程在单个事务中运行, 删除每个表中的所有记录,调用:
ALTER TABLE <tablename> AUTO_INCREMENT = 1
在每个表上,然后使用 INSERT 语句从数据中加载表,例如
INSERT INTO Journal (idJournal, DocumentId, AccountId, Memo, JournalNum,
Amount, Outstanding, Cleared, NameAddressId)
VALUES (11423, 4454, 14, 'Deposit', 1, 53.33, 53.33, 'X', 292)
(注意表格是按正确的顺序加载的,所以相关记录已经存在)。
我发现插入语句需要很长时间(有些长达 70 毫秒),尤其是与从 mysqldump 加载相同数据相比。
我可以做些什么来加快速度(除了使用 mysqldump 代替,我不想这样做,因为我希望备份数据为 json 格式)?
表定义:
CREATE TABLE IF NOT EXISTS `accounts`.`Journal` (
`idJournal` INT NOT NULL AUTO_INCREMENT,
`DocumentId` INT NOT NULL,
`AccountId` INT NOT NULL,
`Memo` VARCHAR(45) NULL,
`JournalNum` INT NOT NULL,
`Amount` DECIMAL(10,2) NOT NULL,
`Outstanding` DECIMAL(10,2) NOT NULL DEFAULT 0,
`Cleared` CHAR(1) NOT NULL,
`NameAddressId` INT NULL,
PRIMARY KEY (`idJournal`),
INDEX `fk_Journal_Document1_idx` (`DocumentId` ASC),
INDEX `fk_Journal_Account1_idx` (`AccountId` ASC),
UNIQUE INDEX `Document_Num` (`DocumentId` ASC, `JournalNum` ASC),
INDEX `fk_Journal_NameAddress1_idx` (`NameAddressId` ASC),
CONSTRAINT `fk_Journal_Document1`
FOREIGN KEY (`DocumentId`)
REFERENCES `accounts`.`Document` (`idDocument`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Journal_Account1`
FOREIGN KEY (`AccountId`)
REFERENCES `accounts`.`Account` (`idAccount`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Journal_NameAddress1`
FOREIGN KEY (`NameAddressId`)
REFERENCES `accounts`.`NameAddress` (`idNameAddress`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
【问题讨论】:
-
所以你对json文件的每一行发出单独的插入查询?
-
我不禁想知道为什么有人会想到尝试这样的任务。 MySQL 有很多现成的backup strategies——为什么要自己动手?!
-
因为我不严格备份,更多允许导出导入数据为json格式。
标签: mysql optimization