MySQL 文档 http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html say :
假设 B 树索引,表的大小会使索引的插入速度减慢 log N。
这是否意味着对于每个新行的插入,插入速度将减慢 log N 倍,其中 N,我假设是行数?即使我在一个查询中插入所有行? IE。 :
INSERT INTO mytable VALUES (1,1,1), (2,2,2), (3,3,3), .... ,(n,n,n)
其中 n 约为 70,000
目前,我的表中有约 147 万行,其结构如下:
CREATE TABLE mytable (
`id` INT,
`value` MEDIUMINT(5),
`date` DATE,
PRIMARY_KEY(`id`,`date`)
) ENGINE = InnoDB
当我以上述方式插入事务时,提交时间约为 275 秒。我该如何优化这一点,因为每天都会添加新数据,并且插入时间只会不断减慢。
另外,除了查询之外,还有什么可能有帮助的吗?也许一些配置设置?
可能的方法 1 - 删除索引
我读到在插入之前删除索引可能有助于插入速度。插入后,我再次添加索引。但这里唯一的索引是主键,在我看来,删除它并没有多大帮助。另外,虽然主键是dropped,所有选择查询都会变得非常慢。
I do not know of any other possible methods.
Edit :以下是在大约 147 万行的表中插入大约 60,000 行的一些测试:
使用上述简单查询:146秒
使用 MySQL 的 LOAD DATA infile :145秒
按照 David Jashi 在他的回答中的建议,使用 MySQL 的 LOAD DATA infile 并拆分 csv 文件:60 个文件(每个 1000 行)需要 136 秒,6 个文件(每个文件 10,000 行)需要 136 秒
删除并重新添加主键:键删除花费了 11 秒,插入数据花费了 0.8 秒,但重新添加主键花费了 153 秒,总共花费了约 165 秒