我有一张大约有2000万行的表格,当我填充它时最终会有大约10亿行。
我注意到插入变得非常缓慢,我几乎没有完成2%。
create table语句是:
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脚本的工作原理如下:
我被困在每分钟22次INSERT(500-1000次 - 相当于每分钟插入大约11000-22000行或每秒大约150-350行插入),我认为可能更快?按照这个速度,收集所有数据需要几个月的时间,我需要在几天内完成...
我正在通过API收集数据 - 也许我可以把它全部放到一个大文件中,然后通过批处理INSERT之外的其他东西以一种方式导入它?
我对此非常困惑,非常感谢知识渊博的人的帮助。
答案 0 :(得分:4)
评论太长了。
删除索引并在加载表后再次添加它们。构建需要一段时间,但负载会更快。
您应该将表格作为文件集“获取”。单独加载文件,直接加载到表或登台表中。如果是后者,则应该执行单个insert语句,如:
insert into t(...)
select . . .
from staging_table;
(也可能有where
条款。
我真正不明白的是为什么你有一个三部分主键,其中一个组件是一个自动增加的列。似乎queue_id
应该是主键(这将进一步导致观察表应该被称为queues
或queue_id
应该是slot_id
)。< / p>
答案 1 :(得分:2)
使用多行插入语法是最高效的方法
INSERT INTO table (field, field2, etc) VALUES (1, 2, etc),(1, 2, etc),(1, 2, etc);
使用VALUES语法的INSERT语句可以插入多行。为此,请包含多个列值列表,每个列值都括在括号内并用逗号分隔。例如:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
每行的值列表必须括在括号内。
编辑。
请看这里有很好的信息:http://dev.mysql.com/doc/refman/5.1/en/insert-speed.html
包括
VALUES
列表INSERT DELAYED
功能