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进行优化)