我有一个包含大约 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 语句(一次性插入它们,而不是通过 500-1000 次单独的 INSERT 操作)。
- 执行 INSERT IGNORE 查询。
我卡在每分钟 22 次 INSERT(乘以 500-1000 - 等于每分钟插入大约 11000-22000 行或每秒大约 150-350 行插入),我认为这会更快吗?按照这个速度,我需要几个月的时间来收集所有数据,而我需要在几天内完成...
我正在通过 API 收集数据 - 也许我可以将其全部放入一个大文件中,然后通过批量 INSERT 之外的其他方式以某种方式将其批量导入?
我真的很困惑,非常感谢有知识的人的帮助。
最佳答案
删除索引并在加载表后再次添加它们。构建需要一些时间,但加载速度会快得多。
您应该将表格“获取”为文件集。单独加载文件,直接加载到表中或加载到暂存表中。如果是后者,您应该像这样执行单个插入语句:
insert into t(...)
select . . .
from staging_table;
(可能还有一个 where
子句)。
我真正不明白的是为什么您有一个由三部分组成的主键,其中一个组件是一个自动递增的列。似乎 queue_id
应该是主键(这将进一步导致观察到该表应该被称为 queues
或 queue_id
应该真的为 slot_id
)。
关于php - MySQL 表 - 如何在十亿行表上快速插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20819626/