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

标签 php mysql sql innodb

我有一个包含大约 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 脚本是这样工作的:

  1. 获取数据。
  2. 创建 500-1000 行 INSERT IGNORE 语句(一次性插入它们,而不是通过 500-1000 次单独的 INSERT 操作)。
  3. 执行 INSERT IGNORE 查询。

我卡在每分钟 22 次 INSERT(乘以 500-1000 - 等于每分钟插入大约 11000-22000 行或每秒大约 150-350 行插入),我认为这会更快吗?按照这个速度,我需要几个月的时间来收集所有数据,而我需要在几天内完成...

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

我真的很困惑,非常感谢有知识的人的帮助。

最佳答案

删除索引并在加载表后再次添加它们。构建需要一些时间,但加载速度会快得多。

您应该将表格“获取”为文件集。单独加载文件,直接加载到表中或加载到暂存表中。如果是后者,您应该像这样执行单个插入语句:

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

(可能还有一个 where 子句)。

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

关于php - MySQL 表 - 如何在十亿行表上快速插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20819626/

相关文章:

php - 将 PHP 关联数组映射到 PDO 准备语句

php - 仅对特定国家/地区的运费征税

php - 计算并存储另一个表中列的 SUM

mysql - 为什么mysql查询发送数据慢

sql - 将 Windows SID 存储在数据库中以进行查找

sql - PostgreSQL 值 1 和 11 的差异

php - 如何将 JSON_INSERT 与字符串中的键一起使用?

php - 如何用php将两种不同形式的输入存储在mySQL数据库中?

php - 带有 XAMPP 的 PHP 中的数据库连接问题

mysql - 在不依赖任何 ID 的情况下选择 MySQL 中的每隔一行?