我正在为某些项目特定目的编写以下子查询:
SELECT count(*) from table1
WHERE userB='$p' AND userA IN
(SELECT userB FROM table1
WHERE userA='$row[username]')
我很好奇这是用PHP做的最好的做法还是我应该采用传统的方式首先获得子查询结果然后计算记录?
答案 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)
答案 4 :(得分:0)
值得注意的是,子查询仅在MySql 4.1及更高版本中可用。 虽然理想情况下每个人都应该使用MySql 5,但有些用户仍然坚持使用他们的主机提供的东西(我已经被这几次蜇过了)。