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

Mysql将子查询转换为依赖子查询,mysql,Mysql,嗨,我不明白,为什么给定查询的子查询正在转换为依赖子查询 尽管子查询不依赖于主查询(不使用主查询表) 我知道这个查询可以使用连接进行优化,但这里我只想知道原因 MYSQL Version 5.5 EXPLAIN SELECT id FROM `cab_request_histories` WHERE cab_request_histories.id = any(SELECT id FROM cab_requests

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

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

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

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

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

MySQL optimizer为此查询使用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\u query
SHOW WARNINGS
查看优化器对查询的处理


这种类型的优化如中所述。

子查询是否针对主查询的每一行执行?我认为可能是这样。它必须检查每个id是否等于历史记录表中的id(当使用=ANY时可能不需要,但它将处理>ANY,并且当in子句或JOIN是更自然的选择时,它可能不会针对=ANY进行优化)