Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL表-如何在十亿行表上快速插入?_Php_Mysql_Sql_Innodb - Fatal编程技术网

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

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

我有一个大约有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脚本的工作方式如下:

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

    我是通过API收集数据的——也许我可以把所有数据都放进一个大文件中,然后通过批插入以外的方式在一个批中导入数据


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

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

    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所需要的全部。