循环中的SQL查询

时间:2011-01-17 19:59:08

标签: php mysql performance optimization google-code

Google代码表明您应该在循环中避免SQL查询。原因是多次往返数据库会显着减慢脚本速度。他们给出的示例查询就是这个。

$userData = array();
foreach ($userList as $user) {
     $userData[] = '("'.$user['first_name'].'", "'.$user['last_name'].'")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES'.implode(',',$userData);
mysql_query($query);

我的问题是...... 1.将查询保持在循环之外有多重要,是否总是可以避免? 2.如何使用相同的逻辑实现SELECT语句。

即。假设我有这个问题。

$index=0;
while ($index < count($id)) {
     $result[] = mysql_query("SELECT * FROM tblInfo WHERE site_id = '".$id[$index]."' ");
     $index++;
}

如何在循环外执行此SELECT语句?我有大量的SELECT语句比这复杂得多。因此,如果认为有必要,我想从循环中获取这些查询。如果有人同意谷歌,请你发一些示例代码。

任何回复都将不胜感激。

3 个答案:

答案 0 :(得分:8)

您可以将MySQL IN运算符与ID列表一起使用。

SELECT * FROM table WHERE id IN (1,4,6,8,5,6)

它甚至可以处理数千个ID的冗长列表(肯定比千SELECT个更好)。但在这种情况下,您还应该考虑设计您的应用程序。如果你需要在每次加载页面时使用带有数千个ID的IN,那么你的设计就会出现问题。

INSERT也可以压缩为一个查询,请参阅documentation

通常,循环中的大多数查询通常都是rewritten as subqueries。但是在这种情况下,您必须在性能和可读性/可维护性之间进行选择。子查询通常很难理解和优化/调试。

答案 1 :(得分:1)

答案 2 :(得分:1)

避免往返费用对你来说有多重要取决于一些事情。

首先,你要做多少次往返?如果你正在制作3或4,如果注意它会很痛苦,你可能会忽略这些建议。

其次,您在设置中往返的费用是多少?如果到数据包的往返时间为100毫秒,则应该比仅花费2毫秒时更加严重。

第三,需要进行查询的过程对时间敏感度如何?如果你让用户等待,你应该注意这一点 - 用户讨厌等待!如果你正在使用一个在幕后运行的Ajax进程并做一些工作,那么它可能不那么重要(尽管你仍然需要注意超时)。

基本上,谷歌的建议是好的,因为浪费的时间是浪费时间。但是,根据您的具体情况,浪费的时间对您,您的系统和您的用户来说可能或多或少都是严重的。