多个小查询与单个长查询。哪个效率更高?
Posted
技术标签:
【中文标题】多个小查询与单个长查询。哪个效率更高?【英文标题】:Multiple small queries vs a single long query. Which one is more efficient? 【发布时间】:2013-03-30 07:16:00 【问题描述】:以下哪种方法更有效:
单个较长的查询:
"SELECT COUNT( * ) AS num
FROM (
SELECT users.UID, cnumber
FROM users
JOIN identity ON users.UID = identity.UID
WHERE 'abc'
IN (google, facebook, twitter, linkedin)
) AS userfound
JOIN jobs ON userfound.cnumber = jobs.cnumber
WHERE JID = 24";
if(resultfromquery == 1)
//Some code here
else
//Some code here
将较长的查询分解为多个单表查询:
uid = "SELECT UID FROM identity WHERE 'abc' IN (google, facebook, twitter, linkedin)";
cnumber_from_usertable = "SELECT cnumber FROM users WHERE UID = 'uid'";
cnumber_from_jobtable = "SELECT cnumber FROM jobs WHERE JID = 24";
if(cnumber_from_usertable == cnumber_from_jobtable)
//Some code here
else
//Some code here
【问题讨论】:
您在尝试时观察到了什么? 仅执行查询会产生明显的开销。因此,进行小查询会多次产生这种开销。除非您的大查询效率很低,否则它将比几个小查询更有效。在您的示例中,差异可能很小,但是当您循环一个查询的结果并为每个结果执行另一个查询时,差异会变得非常明显。 是的,完全正确。数据库实际上是空的。目前,两者之间几乎没有任何区别。所以,我对选择哪一个有两种想法。 最重要的资源永远是用户。如果一个大查询让用户等待,而小查询让用户在数据仍在加载时开始工作,我会说,去最后一个。 【参考方案1】:其实我对此有些不同的看法。 mysql 支持子查询,其中一个原因是将较大的查询分解为较小的查询。如果您使用 INNODB 引擎并且正确使用参数,例如 tmp 表、堆表、缓冲池或查询缓存,那么您可能会获得比较小查询更好的结果。 MYSQL 旨在执行大量小查询,因此最好有更多的小查询而不是更大的查询。
如果更大的查询是更好的选择,那么我们就不需要创建像 Infinidb 和 INfobright 这样使用基于列的结构来运行大型查询的工具,而 MYSQL 是基于行的。
所以想一想,小查询的结果会比大的单个查询更好,而且开销不是查询,而是连接,而且 MYSQL 的连接非常便宜,所以也不用担心它们。但是,如果您的 MYSQL 正在创建线程,那么您无需担心。
简而言之,小型查询与大型查询将是我的选择。
【讨论】:
这是一个有趣的 POV。您能否详细说明“MYSQL 旨在执行大量小查询”? 确实很多人没有意识到这一点,但是如果您明智地使用您的开发技能并将结果有效地存储在 tmp 表中,那么小型查询就会发挥作用。正如我所说,MYSQL 是基于行的,对于较大的集合,您需要进入列式数据库。使用 MYSQL,您最终需要进行表分区以获得更快的结果,这再次告诉我们 MYSQL 喜欢较小的查询。【参考方案2】:测量微时差 ;-) 不过,我会使用单个查询,更少的连接,更少的等待时间,它旨在处理这些事情。
http://www.phpjabbers.com/measuring-php-page-load-time-php17.html
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>
"SELECT COUNT( * ) AS
FROM (
SELECT users.UID, cnumber
FROM users
JOIN identity ON users.UID = identity.UID
WHERE 'abc'
IN (google, facebook, twitter, linkedin)
) AS userfound
JOIN jobs ON userfound.cnumber = jobs.cnumber
WHERE JID = 24";
if(resultfromquery == 1)
//Some code here
else
//Some code here
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';
?>
【讨论】:
以上是关于多个小查询与单个长查询。哪个效率更高?的主要内容,如果未能解决你的问题,请参考以下文章