【问题标题】:How to execute many mysql queries with PHP如何使用 PHP 执行许多 mysql 查询
【发布时间】:2015-03-23 12:20:20
【问题描述】:

假设我有一个名为“users”的 mysql 表,而且我经常必须为我的每个用户在另一个 mysql 表中插入一条记录。

例如:

<?php
$result = mysqli_query( $c,"SELECT user_id FROM users WHERE '$search'" );
while( $array = mysqli_fetch_array( $result ) ) {
  // execute a query for each users
  mysqli_query( $c,"INSERT INTO example ( id, user_id, record1, record2, date ) VALUES ( NULL, '$array[user_id]', '$record1', '$record2', '$date' )" );
  $count++;
}
echo "$count rows added";
?>

如果我有 1'000 或 10'000 个用户,一切都会很好。

但我想知道,如果我有 100,000 个用户(甚至更多),我应该如何避免服务器错误/内存限制?

有办法拆分我的脚本吗?

【问题讨论】:

  • 使用 INSERT INTO example SELECT id FROM users 之类的东西将所有这些都简化为一个查询....有关详细信息,请参阅 manual
  • 一个查询,插入 someTable 从其他表中选择一些记录,在您的示例中无需将任何内容带入 php。

标签: php mysql loops while-loop split


【解决方案1】:

考虑使用INSERT ... SELECT 命令。

<?php
    $result = mysqli_query( $c,"INSERT INTO example ( id, user_id, record1, record2, date ) SELECT NULL, user_id, '$record1', '$record2', '$date' FROM users WHERE '$search'" );
?>

【讨论】:

  • 谢谢,您知道如何使用 insert..select 计算受影响的行数吗?
  • 我认为通常的mysqli_affected_rows 应该可以解决问题。检查一下我当前机器上没有mysql,试试看。
【解决方案2】:

使用mysqlINSERT .... SELECT

mysqli_query($c,"INSERT INTO example (id, user_id, record1, record2, date)
SELECT NULL, user_id, '$record1', '$record2', '$date' FROM 
users WHERE '$search'");

【讨论】:

    【解决方案3】:

    永远不要在大循环中执行查询,1000 已经是一个非常糟糕的主意:

    <?php
    $result = mysqli_query( $c,"SELECT user_id FROM users WHERE '$search'" );
    $insert = array();
    while( $array = mysqli_fetch_array( $result ) ) {
      // execute a query for each users
      $insert[] = "( NULL, '$array[user_id]', '$record1', '$record2', '$date' )";
    }
    mysqli_query( $c,"INSERT INTO example ( id, user_id, record1, record2, date ) VALUES " . implode(', ', $insert) );
    echo count($insert) . " rows added";
    ?>
    

    【讨论】:

    • 也不需要这样做,效率非常低。
    • 不将数据从数据库服务器拉到Web服务器,这样你就可以在php中做一些事情是低效的。如果您可以在数据库服务器上完成所有操作,那么您应该这样做。不是 php 的事情,如果你用 c# 客户端程序和 sql server 做同样的事情,那就一样糟糕了。
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 2018-10-24
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多