假设 B-tree 索引,表的大小会减慢 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 - 删除索引
我读到在插入之前删除索引可能有助于插入速度。插入后,我再次添加索引。但是这里唯一的索引是主键,我认为删除它并没有多大帮助。此外,当主键被删除时,所有的选择查询都会变得非常缓慢。
我不知道任何其他可能的方法。
编辑:以下是在表中插入约 60,000 行的一些测试,其中约 147 万行:
使用上述普通查询: 146 秒
使用 MySQL 的 LOAD DATA infile: 145 秒
使用 MySQL 的 LOAD DATA infile 并按照 David Jashi 在他的回答中的建议拆分 csv 文件: 136 秒用于 60 个文件,每个文件 1000 行,136 秒用于 6 个文件,每个文件 10,000 行
删除和重新添加主键:删除密钥需要 11 秒,插入数据需要 0.8 秒,但重新添加主键需要 153 秒,总共需要约 165 秒