Mysql将子查询转换为依赖子查询

时间:2013-05-02 09:06:36

标签: mysql

您好我不明白为什么给定查询的子查询转换为依赖子查询。

虽然子查询在主查询上不依赖(不使用主查询表)。

我知道这个查询可以使用连接进行优化,但在这里我只是想知道这个的原因

MYSQL Version 5.5

EXPLAIN SELECT id  FROM  `cab_request_histories` 
WHERE cab_request_histories.id = any(SELECT id
                                     FROM cab_requests
                                     WHERE cab_requests.request_type =  'pickup')

id   select_type      table type           possible_keys     key               key_len  ref rows Extra
1    PRIMARY    cab_request_histories   index             NULL             PRIMARY  4   NULL    20                       

2    DEPENDENT       SUBQUERY          cab_requests unique_subquery    PRIMARY  PRIMARY 4 func  1

2 个答案:

答案 0 :(得分:1)

我怀疑ANY关键字需要MySQL将子查询外部的值传递到其中以评估结果是否为真。

答案 1 :(得分:1)

Mysql优化器对此查询使用EXIST策略,有效地将其更改为:

SELECT id  FROM  cab_request_histories
WHERE EXISTS 
  ( SELECT 'this one is dependent' FROM cab_requests
    WHERE cab_requests.request_type =  'pickup' 
    AND cab_requests.id = cab_request_histories.id )

您可以使用EXPLAIN EXTENDED your_query后跟SHOW WARNINGS查看优化程序对您的查询的作用。

http://dev.mysql.com/doc/refman/5.5/en/subquery-optimization-with-exists.html中描述了这种类型的优化。