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语句比这复杂得多。因此,如果认为有必要,我想从循环中获取这些查询。如果有人同意谷歌,请你发一些示例代码。
任何回复都将不胜感激。
答案 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进程并做一些工作,那么它可能不那么重要(尽管你仍然需要注意超时)。
基本上,谷歌的建议是好的,因为浪费的时间是浪费时间。但是,根据您的具体情况,浪费的时间对您,您的系统和您的用户来说可能或多或少都是严重的。