这个查询
SELECT * FROM `people` WHERE `country` IN (
SELECT `id` FROM `country` WHERE `available`
)
为每个人搜索可用的时间,或者只进行一次,并且尽可能快?
使用INNER JOIN
来忽略那些国家/地区不可用的人时,也许是个好主意?
或者将这个分成两个查询可能是个好主意? (首先选择所有可用的国家/地区)?
什么是最好的方法?
答案 0 :(得分:1)
如果您使用较新版本的MySQL并注意不要在子查询上添加太多复杂性,MySQL查询优化器将自动通过连接替换子查询,请参阅:
http://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html
在MySQL中,子查询必须满足这些条件才能作为a处理 半联接:
它必须是出现在顶层的IN(或= ANY)子查询 WHERE或ON子句,可能作为AND表达式中的术语。对于 例如:
SELECT ... FROM ot1,... WHERE(oe1,...)IN(SELECT ie1,... FROM it1,......在哪里......);这里,ot_i和it_i表示外部的表 查询的内部部分,oe_i和ie_i表示表达式 引用外表和内表中的列。
它必须是没有UNION构造的单个SELECT。
它不能包含GROUP BY或HAVING子句或聚合 功能
它必须没有ORDER BY和LIMIT。
外表和内表的数量必须小于 连接中允许的最大表数。
子查询可能是相关的或不相关的。允许DISTINCT, 除非也使用ORDER BY,否则为LIMIT。