MySQL表 - 如何在十亿行表上快速插入?

时间:2013-12-28 21:33:37

标签: 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` 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脚本的工作原理如下:

  1. 获取数据。
  2. 创建500-1000行INSERT IGNORE语句(将它们插入一个“go”而不是通过500-1000个单独的INSERT操作)。
  3. 执行INSERT IGNORE查询。
  4. 我被困在每分钟22次INSERT(500-1000次 - 相当于每分钟插入大约11000-22000行或每秒大约150-350行插入),我认为可能更快?按照这个速度,收集所有数据需要几个月的时间,我需要在几天内完成...

    我正在通过API收集数据 - 也许我可以把它全部放到一个大文件中,然后通过批处理INSERT之外的其他东西以一种方式导入它?

    我对此非常困惑,非常感谢知识渊博的人的帮助。

2 个答案:

答案 0 :(得分:4)

评论太长了。

删除索引并在加载表后再次添加它们。构建需要一段时间,但负载会更快。

您应该将表格作为文件集“获取”。单独加载文件,直接加载到表或登台表中。如果是后者,则应该执行单个insert语句,如:

insert into t(...)
   select . . .
   from staging_table;

(也可能有where条款。

我真正不明白的是为什么你有一个三部分主键,其中一个组件是一个自动增加的列。似乎queue_id应该是主键(这将进一步导致观察表应该被称为queuesqueue_id应该是slot_id)。< / p>

答案 1 :(得分:2)

使用多行插入语法是最高效的方法

INSERT INTO table (field, field2, etc) VALUES (1, 2, etc),(1, 2, etc),(1, 2, etc);

Manual

  

使用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功能
  • “并发插入内容”