Mysql 多个小查询与单个长查询。哪一个更有效?

Mysql 多个小查询与单个长查询。哪一个更有效?,mysql,Mysql,以下哪种方法更有效: 单个较长的查询: "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.cnum

以下哪种方法更有效:

单个较长的查询:

"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

测量微时差- 不过,我会使用单一查询,更少的连接,更少的等待时间,而且它是为处理这类事情而设计的


事实上,我对此有不同的看法。MYSQL支持子查询,其中一个原因是将较大的查询分解为较小的查询。如果您使用的是INNODB引擎,并且正确使用了参数,例如tmp表、堆表、缓冲池或查询缓存,那么您可能会得到比较小查询更好的结果。MYSQL被设计用来执行大量的小查询,因此最好是有更多的小查询,而不是更大的查询

如果更大的查询是一个更好的选择,那么我们就不需要创建像Infinidb和INfobright这样的工具,它使用基于列的结构来运行大型查询,因为MYSQL是基于行的

所以想想看,小的查询比大的单个查询结果更好,开销不是查询,而是连接,MYSQL使用连接非常便宜,所以也不用担心它们的开销。但是如果您的MYSQL正在创建线程,那么您就没有什么可担心的了


简而言之,我会选择少量小查询和大型查询。

您在尝试时观察到了什么?仅执行一个查询会带来明显的开销。因此,执行小查询会导致多次开销。除非您的大查询效率很低,否则它将比几个小查询效率更高。在这里的示例中,差异可能很小,但是当您循环一个查询的结果并对每个结果执行另一个查询时,差异变得非常明显。是的,没错。数据库实际上是空的。目前,两者之间几乎没有任何区别。所以,我对该选择哪一个有两个想法。最重要的资源总是用户。如果一个大的查询让用户等待,而小的查询让用户在数据仍在加载的时候开始工作,我会说,去做最后一个。这是一个有趣的观点。你能详细说明一下MYSQL是为了执行很多小查询而设计的吗?事实上,很多人都没有意识到这一点,但是如果你明智地使用你的开发技能,并将结果高效地存储在tmp表中,小查询就会发挥神奇的作用。正如我所说的,MYSQL是基于行的,对于更大的集合,您需要移动到柱状数据库中。使用MYSQL,您最终需要进行表分区以获得更快的结果,这再次告诉我们MYSQL喜欢较小的查询。
<?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.';
?>