MySQL是否正在向IN添加子查询,以确保性能?

时间:2014-01-27 15:48:25

标签: mysql

这个查询

SELECT * FROM `people` WHERE `country` IN (
    SELECT `id` FROM `country` WHERE `available`
)

为每个人搜索可用的时间,或者只进行一次,并且尽可能快?

使用INNER JOIN来忽略那些国家/地区不可用的人时,也许是个好主意?

或者将这个分成两个查询可能是个好主意? (首先选择所有可用的国家/地区)?

什么是最好的方法?

1 个答案:

答案 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。