Php MySQL表-如何在十亿行表上快速插入?
我有一个大约有2000万行的表,当我填充它时,它最终将大约有10亿行 我注意到插入变得非常缓慢,我几乎没有完成2% create table语句是:Php MySQL表-如何在十亿行表上快速插入?,php,mysql,sql,innodb,Php,Mysql,Sql,Innodb,我有一个大约有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` in
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脚本的工作方式如下:
我对此感到非常困惑,非常感谢有知识的人的帮助。使用多行插入语法是最有效的方法
INSERT INTO table (field, field2, etc) VALUES (1, 2, etc),(1, 2, etc),(1, 2, etc);
:
使用VALUES语法的INSERT语句可以插入多行。为此,请包含多个列值列表,每个列值用括号括起来,并用逗号分隔。例如:
在tbl_名称中插入(a、b、c)值(1,2,3)、(4,5,6)、(7,8,9)代码>
每行的值列表必须用括号括起来
编辑
请看这里,这里有一些很好的信息:
包括
- 使用多个
值
列表
- 利用
插入延迟功能
- “并发插入”
这篇评论太长了
加载表后,删除索引并再次添加它们。构建需要一段时间,但加载速度会快得多
您应该将表作为文件集“获取”。单独加载文件,可以直接加载到表中,也可以加载到临时表中。如果是后者,则应执行一个insert语句,如下所示:
insert into t(...)
select . . .
from staging_table;
(可能还有where
子句)
我真正不明白的是,为什么有一个由三部分组成的主键,其中一个组件是一个自动递增的列。似乎queue\u id
应该是主键(这将进一步导致观察到该表应该被称为queues
或queue\u id
应该是slot\u id
)。我一次处理大约500-1000行,但速度仍然很慢。如果您还没有使用它们,查询参数可能会略微加快生产速度。然而,Gordon提到你的索引可能是导致减速的原因时,可能是一针见血。我在customerid、orderid和queueid上有一个唯一的键,因为这3个值需要是唯一的(以避免重复)。queueid(自动增量字段)上的主索引是否会比这个由三部分组成的主键快(以及快多少)?如果使用暂存表(这是一个非常好的主意),则不必删除并重新创建索引。queueid将始终是唯一的,因为它是自动增量的。这可能是你PK所需要的全部。