0

嗨,我不明白,为什么给定查询的子查询正在转换为依赖子查询。

尽管子查询不依赖于主查询(不使用主查询表)。

我知道可以使用联接优化此查询,但在这里我只想知道原因

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
4

2 回答 2

1

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

于 2013-05-02T09:39:51.130 回答
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中有描述。

于 2013-05-02T10:37:56.110 回答