【发布时间】:2013-12-28 21:33:37
【问题描述】:
我有一个包含大约 2000 万行的表,当我填充它时,最终将有大约 10 亿行。
我注意到插入变得非常缓慢,我只完成了 2%。
创建表语句为:
CREATE TABLE `slots` (
`customerid` int(11) NOT NULL,
`orderid` int(11) NOT NULL,
`queueid` int(11) NOT NULL AUTO_INCREMENT,
`item_id` int(3) NOT NULL,
`variable1` int(3) NOT NULL,
`variable2` int(3) NOT NULL,
`variable3` int(3) NOT NULL,
`variable4` int(3) NOT NULL,
`variable5` int(3) NOT NULL,
`variable6` int(3) NOT NULL,
`variable7` tinyint(1) NOT NULL,
`variable8` tinyint(1) NOT NULL,
`variable9` tinyint(1) NOT NULL,
PRIMARY KEY (`customerid`,`orderid`,`queueid`),
UNIQUE KEY `queueid` (`queueid`),
KEY `orderid` (`orderid`)
) ENGINE=InnoDB AUTO_INCREMENT=25883472 DEFAULT CHARSET=latin1
现在插入 PHP 脚本的工作方式如下:
- 获取数据。
- 创建 500-1000 行 INSERT IGNORE 语句(将它们插入到一个“go”中,而不是通过 500-1000 个单独的 INSERT 操作)。
- 执行 INSERT IGNORE 查询。
我被困在每分钟 22 次插入(乘以 500-1000 - 相当于每分钟插入大约 11000-22000 行或每秒大约 150-350 行插入),我认为这可能更快?按照这个速度,我需要几个月的时间来收集所有数据,而且我需要在几天内完成......
我正在通过 API 收集数据 - 也许我可以将它们全部放入一个大文件中,然后以某种方式通过批量 INSERT 以外的其他方式将其以某种方式导入?
我对此感到非常困惑,非常感谢有知识的人的帮助。
【问题讨论】:
-
如果您还没有使用它们,查询参数可能会稍微加快生产速度。然而,当 Gordon 提到您的索引可能是导致放缓的原因时,他可能一针见血。