MySQL与多次调用的嵌套查询性能。 (PHP)

时间:2013-10-24 23:52:38

标签: php mysql

使用嵌套查询而不是将它们分开是否有任何好处?

我正在使用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函数,在这里我不必重复那么多的查询字符串代码,但如果进行这么多额外的调用(这些可以得到很深的嵌套)会非常糟糕为了表现,我可能会保留它。或者至少留意它。

2 个答案:

答案 0 :(得分:1)

这取决于这些表的大小以及您要放置负载的位置。如果这些表很大并且看到很多活动,那么具有两个单独查询的第二个版本将最小化您可能因连接而看到的锁定时间。但是,如果你有一个具有快速SSD存储的强大数据库服务器,你最好避免两次浸入数据库的开销。

所有条件都相同我可能会选择前者 - 这是一个数据库问题所以应该在那里解决。我想这些表不会特别经常写,所以我确保有足够的MySQL缓存可用,并密切关注慢查询日志。

答案 1 :(得分:1)

与大多数包含“更快”或“更好”的问题一样,这是一种权衡,它取决于您希望加速哪个部分以及您对“更好”的定义。

与两个单独的查询相比,组合查询具有以下优点:

  • 速度:你只需要向数据库系统发送一个查询,数据库只需要解析一个查询字符串,只需要编写一个查询计划,只需要将一个结果重新推送回来并通过连接到PHP。然而,差异(当不执行这些查询数千次时)非常最小。
  • 原子性:如果words表在第一个和第二个查询之间发生变化,则两部分的查询可能会从组合查询中提供不同的结果(尽管在此特定示例中这可能是不是一个不断变化的表...)

同时,组合查询还具有 dis 的优势(正如您已暗示的那样):

  • 可重用性:当您可以重新使用第一个查询并将第二个查询替换为从words表中选择不同列的内容时,拆分查询可能会派上用场或完全来自另一张桌子的东西。通过使用类似查询构建器(不要与ORM混淆!)来动态组合查询,根据需要添加where子句和连接,可以减轻这种缺点。有关查询构建器的示例,请查看Zend\Db\Sql
  • 锁定:根据您使用的存储引擎和存储引擎版本,表可能会被锁定。但是大多数select语句都没有锁定表,而InnoDB引擎肯定没有。然而,如果您在MyISAM存储引擎上使用旧版本的MySQL,那么您的表负载很重,这可能是一个因素。请注意,即使 if 组合语句锁定表,组合查询也会提供更快的平均完成时间,因为它总体上更快,而拆分查询将提供更快的初始响应(到第一个查询),同时仍然需要更长的总时间(由于额外的往返等等)。