Php 在MySQL中编写子查询是一种很好的做法吗?
我编写以下子查询是为了某个项目的特定目的:Php 在MySQL中编写子查询是一种很好的做法吗?,php,sql,mysql,database,query-optimization,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中执行此操作时的最佳实践,还是应该采用传统的方法,首先获取子查询结果,然后计算记录?只要子查询不会导致性能下降,我认为最好只使用一个查询。它将最小化您必须编写和维护的代码,这几乎总是一件好
SELECT count(*) from table1
WHERE userB='$p' AND userA IN
(SELECT userB FROM table1
WHERE userA='$row[username]')
我很好奇,这是在PHP中执行此操作时的最佳实践,还是应该采用传统的方法,首先获取子查询结果,然后计算记录?只要子查询不会导致性能下降,我认为最好只使用一个查询。它将最小化您必须编写和维护的代码,这几乎总是一件好事 我很好奇,这是在PHP中执行此操作的最佳实践,还是应该采用传统的方法,首先获取子查询结果,然后计算记录 抛开PHP或存储过程holy war中的SQL查询不谈,减少对数据库的访问是最佳实践。有时间返回数据库&这是永远无法收回的,分离查询会有在查询之间更改数据的风险 查询本身可以优化吗?在本例中,可能是:
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中,您只需将关键字explain添加到SELECT查询中,在SELECT
关键字之前。即:
EXPLAIN SELECT COUNT(*)
FROM TABLE t
JOIN TABLE t2 ON t2.userB = t.userA
AND t2.userA = '$row[username]'
WHERE t.userB = '$p'
可能应该在前面提到这一点,但您不想在PHP中运行它,因为它不会返回您查询的内容。使用任何SQLIDE,比如PHPMyAdmin/etc
我有我的解释计划,但这意味着什么?!
是阅读返回的每一列以及该列表示的内容的好地方。一般来说,大多数数据库使用左连接(您的查询可以转换为左连接)比使用子查询执行得更好 我同意Ted的观点,左键连接会更快。而且它也更容易阅读。
也不要使用count(*),使用count(id)值得注意的是,子查询仅在MySql 4.1及更高版本中可用。
虽然理想情况下每个人都应该在MySql 5上,但有些用户仍然坚持使用他们的主机提供的服务(我已经被这个问题困扰了好几次)。一般来说都会加入,但也有来自OMG Ponies的CaveatSexplane SELECT*+1.