使用嵌套查询而不是将它们分开是否有任何好处?
我正在使用PHP经常从MySQL查询,并希望将它们分开以便更好地组织。例如:
时:
$query = "SELECT words.unique_attribute
FROM words
LEFT JOIN adjectives ON adjectives.word_id = words.id
WHERE adjectives = 'confused'";
return $con->query($query);
比说:
更快/更好$query = "SELECT word_id
FROM adjectives
WHERE adjectives = 'confused';";
$id = getID($con->query($query));
$query = "SELECT unique_attribute
FROM words
WHERE id = $id;";
return $con->query($query);
第二个选项会给我一个方法来创建一个select函数,在这里我不必重复那么多的查询字符串代码,但如果进行这么多额外的调用(这些可以得到很深的嵌套)会非常糟糕为了表现,我可能会保留它。或者至少留意它。
答案 0 :(得分:1)
这取决于这些表的大小以及您要放置负载的位置。如果这些表很大并且看到很多活动,那么具有两个单独查询的第二个版本将最小化您可能因连接而看到的锁定时间。但是,如果你有一个具有快速SSD存储的强大数据库服务器,你最好避免两次浸入数据库的开销。
所有条件都相同我可能会选择前者 - 这是一个数据库问题所以应该在那里解决。我想这些表不会特别经常写,所以我确保有足够的MySQL缓存可用,并密切关注慢查询日志。
答案 1 :(得分:1)
与大多数包含“更快”或“更好”的问题一样,这是一种权衡,它取决于您希望加速哪个部分以及您对“更好”的定义。
与两个单独的查询相比,组合查询具有以下优点:
words
表在第一个和第二个查询之间发生变化,则两部分的查询可能会从组合查询中提供不同的结果(尽管在此特定示例中这可能是不是一个不断变化的表...)同时,组合查询还具有 dis 的优势(正如您已暗示的那样):
words
表中选择不同列的内容时,拆分查询可能会派上用场或完全来自另一张桌子的东西。通过使用类似查询构建器(不要与ORM混淆!)来动态组合查询,根据需要添加where子句和连接,可以减轻这种缺点。有关查询构建器的示例,请查看Zend\Db\Sql。