【问题标题】:Database query speed数据库查询速度
【发布时间】:2012-06-03 03:23:02
【问题描述】:

我有一个 php 脚本,它连续运行几个小时,每隔几秒我就有新数据要保存在数据库中。所以我可以选择在新数据可用时存储新数据,或者将它们收集在一个数组中,一旦我有 100 或 500 个就保存它们。如果我是正确的,php 不能向数据库发送多个插入查询,所以上面的两个选项将采取节省的时间完全相同。

我错了还是一个比另一个快?也许还有比这些更快的第三种解决方案?

【问题讨论】:

  • 只是好奇,您最终使用的是 LOAD DATA INFILE 还是多记录 INSERT?
  • 多插入。每一秒都很宝贵,所以我不想浪费时间写一个文件然后读回来

标签: php mysql performance optimization batch-file


【解决方案1】:

您可以使用以下语法一次插入多行:

INSERT INTO foo
( a, b, c)
VALUES
( 1, 2, 3),
( 4, 5, 6),
( 7, 8, 9)

或者,您可以在获得数据时将数据转储到一个分隔文件中,当您在文件中达到 100 行左右时,使用 LOAD DATA INFILE (http://dev.mysql.com/doc/refman/5.5 /en/load-data.html) 进行插入。我发现 LOAD DATA INFILE 对于导入大量数据非常有效。

【讨论】:

    【解决方案2】:

    两者都不会更快。但是如果你使用批量插入并将插入包装在一个事务中,它会明显更快。

    BEGIN TRANSACTION;
    INSERT INTO ...
    INSERT INTO ...
    INSERT INTO ...
    COMMIT;
    

    这仅在存储引擎允许事务时才有效。所以最好使用 InnoDB 而不是 MyISAM。

    【讨论】:

      【解决方案3】:

      我推荐使用离线批处理存储过程选项。这样你会:

      • 保存每次脚本调用的连接时间,否则(我假设是这样,但我没有看到你的脚本)
      • 节省php和mysql的通信时间
      • 保存解析解释,因为所有数据都将在 sql 引擎中一次处理

      rgds.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2018-08-01
        • 2018-10-10
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 2013-12-24
        相关资源
        最近更新 更多