在MySQL中编写子查询是一个好习惯吗?

时间:2009-12-09 01:02:33

标签: php sql mysql database query-optimization

我正在为某些项目特定目的编写以下子查询:

SELECT count(*) from table1 
WHERE userB='$p' AND userA IN 
  (SELECT userB FROM table1 
   WHERE userA='$row[username]')

我很好奇这是用PHP做的最好的做法还是我应该采用传统的方式首先获得子查询结果然后计算记录?

5 个答案:

答案 0 :(得分:18)

  

我很好奇这是用PHP做的最好的做法还是我应该采用传统的方式首先获得子查询结果然后计算记录?

将PHP查询保留在PHP或存储过程中的圣战之外,最少的数据库访问是最佳实践。有时间到数据库&无法收回的后退,并且分离查询会在查询之间存在数据更改的风险。

查询本身可以优化吗?在这个例子中,可能是的:

SELECT COUNT(*) 
  FROM TABLE t
  JOIN TABLE t2 ON t2.userB = t.userA
               AND t2.userA = '$row[username]'
 WHERE t.userB = '$p' 

如果您真的想确定查询性能,那么您必须熟悉生成解释计划&解释输出以调整查询。

什么是解释计划?

MySQL解释计划显示了MySQL查询优化器如何决定运行SELECT语句以便最好地访问已请求的数据。

如何生成解释计划?

在MySQL中,您只需在SELECT关键字之前将关键字 explain 添加到SELECT查询中。 IE:

EXPLAIN SELECT COUNT(*)
          FROM TABLE t
          JOIN TABLE t2 ON t2.userB = t.userA
                       AND t2.userA = '$row[username]'
         WHERE t.userB = '$p'

可能之前应该提到过这个,但是你不想在PHP中运行它,因为它不会返回你查询的内容。使用任何SQL IDE,如PHPMyAdmin / etc。

我已经解释了我的解释计划,但它意味着什么?!

MySQL EXPLAIN documentation是阅读每个返回列的好地方,&该栏代表什么。

答案 1 :(得分:2)

只要子查询不会导致性能下降,我认为坚持一个查询会更好。它将最小化您必须编写和维护的代码,这几乎总是一件好事。

答案 2 :(得分:1)

通常,大多数数据库使用左连接(您的查询可以转换为)比子查询更好。

答案 3 :(得分:1)

我同意特德的看法,离开加盟会更快。而且它也更容易阅读。 也不要使用count(*),使用 count(id)

答案 4 :(得分:0)

值得注意的是,子查询仅在MySql 4.1及更高版本中可用。 虽然理想情况下每个人都应该使用MySql 5,但有些用户仍然坚持使用他们的主机提供的东西(我已经被这几次蜇过了)。