Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.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_Query Optimization - Fatal编程技术网

Php 为什么这个MySQL查询会减慢我的代码速度

Php 为什么这个MySQL查询会减慢我的代码速度,php,mysql,query-optimization,Php,Mysql,Query Optimization,目前,我有一个用PHP运行的MySQL查询,在查看结果时,我会更新原始表,但一个包含500行的简单表需要30秒才能完成: $sqlquery = mysql_query('SELECT id, special_data FROM stats_visits WHERE processed = 0'); while($row = mysql_fetch_assoc($sqlquery)){ $stat_id = $row['id']; // Make use of special_

目前,我有一个用PHP运行的MySQL查询,在查看结果时,我会更新原始表,但一个包含500行的简单表需要30秒才能完成:

$sqlquery = mysql_query('SELECT id, special_data FROM stats_visits WHERE processed = 0');
while($row = mysql_fetch_assoc($sqlquery)){ 
    $stat_id = $row['id'];
    // Make use of special_data field for some operations
    mysql_query('UPDATE stats_visits SET processed = 1 WHERE id = ' . $stat_id);
}
是因为我正在更新从中选择的表吗?我通过执行以下操作解决了这一问题,但由于该表将来可能有数千条记录,我不确定in的保存情况如何:

$statids = array();

$sqlquery = mysql_query('SELECT id, special_data FROM stats_visits WHERE processed = 0');
while($row = mysql_fetch_assoc($sqlquery)){ 
    $statids[] = $row['id'];
    // Make use of special_data field for some operations
}

mysql_query('UPDATE stats_visits SET processed = 1 WHERE id IN(' . implode(',', $statids) . ')');

如果您只想将所有记录更新为“正在处理”
processed=1
为什么不用一个查询来解决它呢

UPDATE `stats_visits` SET `processed` = 1 WHERE `processed` = 0;

如果您只想将所有记录更新为“正在处理”
processed=1
为什么不用一个查询来解决它呢

UPDATE `stats_visits` SET `processed` = 1 WHERE `processed` = 0;

在第一个版本中,每次更新都会访问数据库一次。这通常是个坏主意。第二个版本正在访问数据库一次


如果你担心这将如何在未来的工作,也许创造一个混合。将更新分为100组进行批处理,并分块进行更新

在第一个版本中,每次更新都会访问数据库一次。这通常是个坏主意。第二个版本正在访问数据库一次


如果你担心这将如何在未来的工作,也许创造一个混合。将更新分为100组进行批处理,并分块进行更新

最简单的方法是将所有需要更新的ID存储为一个数组,然后使用
IN
操作符将其内爆到查询中

e、 g


最简单的方法是将所有需要更新的ID存储为一个数组,然后使用
IN
操作符将其内爆到查询中

e、 g


为什么要获取所有行并按id进行更新,而不是仅根据SELECT中使用的条件进行更新?在该SELECT中(我可能应该指出这一点),我选择了更多数据,使用它进行处理,一旦使用,我需要通过设置processed=1来指示这一点,以便在下次运行时可以跳过它。如果您所做的只是更新
processed
列,那么就没有理由运行
选择
更新
查询。您可以使用下面提供的答案@Truth。另一个选项是使用一个编辑过的数据数组,并将所有内容组合成两个查询。您还可以研究使用临时表和跨表更新->我不是简单地更新列,我已经编辑了我的问题表明我选择了更多数据,使用它,然后在完成后将该记录设置为“已处理”。为什么要获取所有行并按id进行更新,而不是仅根据SELECT中使用的条件进行更新?在该SELECT中(我可能应该指出这一点),我选择了更多数据,使用它进行处理,一旦使用,我需要通过设置processed=1来指示这一点,以便在下次运行时可以跳过它。如果您所做的只是更新
processed
列,那么就没有理由运行
选择
更新
查询。您可以使用下面提供的答案@Truth。另一个选项是使用一个编辑过的数据数组,并将所有内容组合成两个查询。您还可以研究使用临时表和跨表更新->我不是简单地更新列,我编辑了我的问题,表明我选择了更多数据,使用它,然后在完成后,我将该记录设置为“已处理”。因为在该选择中(我可能已经指出了这一点)我选择了更多的数据,将其用于处理,一旦使用,我需要通过设置processed=1来表明这一点,以便在下一次运行中,我可以跳过它。-1如果他进行处理(如上所述)然后,您可能会意外地将记录标记为未实际处理的已处理记录。在OPs查询中,他所做的所有操作都是选择行,然后更新这些行。有效地执行@Truth所述的操作是相同的。这是正确的答案。您的另一个选择是将此
UPDATE
UPDATE
fo组合r您对“其他数据”的“处理”。您还可以研究使用临时表和跨表更新->因为在该选择中(我可能已经指出这一点),我选择了更多数据,使用它进行处理,一旦使用,我需要通过设置processed=1来指示这一点,以便在下一次运行中,我可以跳过它。-1如果他进行处理(如上所述)然后,您可能会意外地将记录标记为未实际处理的已处理记录。在OPs查询中,他所做的所有操作都是选择行,然后更新这些行。有效地执行@Truth所述的操作是相同的。这是正确的答案。您的另一个选择是将此
UPDATE
UPDATE
fo组合r您对“其他数据”的“处理”…您还可以研究使用临时表和跨表更新->这就是我最终要做的。这就是我最终要做的。批处理听起来像个好主意-实现了它,工作起来像个符咒,不用担心查询太长。谢谢。批处理听起来像个好主意-实现了它,工作起来像个符咒,不用担心查询太长太长了,谢谢。