【问题标题】:Insert lots of rows with only a number插入大量只有一个数字的行
【发布时间】:2014-01-14 14:44:01
【问题描述】:

在一个表中创建 899 行的最快方法是什么,只使用数字。该列不是自动递增的。

目前我创建一个这样的查询:

$a1=range(100,999);
$a1=implode('),(',$a1);
$a1='INSERT INTO groups (val) VALUES('.$a1.')';

它给出了一个像这样的巨大查询:

INSERT INTO groups (val) VALUES(100),(101),(102),(103),(104),(105),(106),(107),(108),
(109),(110),(111),(112),(113),(114),(115),(116),(117),(118),(119),(120),(121),(122),
(123),(124),(125), etc etc etc....

我想知道是否有更快更好的方法来做到这一点?

【问题讨论】:

  • 我建议对这类任务使用存储过程。
  • 查看数字表生成器@stackoverflow.com/questions/9751318/…
  • 我认为这个问题不值得投反对票。 OP 展示了迄今为止尝试的内容(哪些有效),并提出了一个有针对性的问题。我知道代码 sn-p 不完整(并且没有提及编程语言),但问题很清楚。
  • 更快更好……这还不够快吗?

标签: php mysql performance optimization


【解决方案1】:

我认为您没有更快的方法来做到这一点。看MySQL documentation

插入一行所需的时间由以下决定 因素,其中数字表示近似比例:

连接:(3)

向服务器发送查询:(2)

解析查询:(2)

插入行:(1 × 行大小)

插入索引:(1 × 索引数)

结束:(1)

这没有考虑打开的初始开销 表,对每个并发运行的查询执行一次。

表的大小减慢了log N插入索引的速度, 假设 B-tree 索引。

您可以使用以下方法来加快插入速度:

如果您同时从同一个客户端插入多行, 使用带有多个 VALUES 列表的 INSERT 语句来插入多个 一次行。这要快得多(在某些情况下要快很多倍 例)而不是使用单独的单行 INSERT 语句。如果你是 将数据添加到非空表中,您可以调整 bulk_insert_buffer_size 变量使数据插入更快。 请参阅第 5.1.4 节,“服务器系统变量”。

通过一个查询,您可以保存 Connecting、Sending query to server、Closing,以及优化您的查询的 MySQL。

另外,如果您只插入大约 1000 行数据,那么插入速度非常快,因此在这种情况下我不会担心性能问题。

【讨论】:

  • 谢谢。然后我会坚持这个大查询:-)
【解决方案2】:

如果需要,可以使用较小的查询来获取一系列数字:-

INSERT INTO groups (val)
SELECT Hundreds.a * 100 + Tens.a * 10 + Units.a AS aNumber
FROM
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Hundreds,
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Tens,
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Units
HAVING aNumber BETWEEN 100 AND 999

但不确定这会为您节省多少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 2015-04-03
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多