2013-05-02 56 views
0

嗨,我不明白为什么给定查询的子查询正在转换为依赖子查询。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 

回答

1

我怀疑任何关键字将需要MySQL来从子查询的外部值传递的原因到里面去评估结果是否真实。

+0

子查询是否正在执行主查询的每一行?, – praveen 2013-05-02 10:34:55

+0

我想可能是这样。它必须检查每个id是否与历史记录表中的id相同(使用= ANY时可能不需要,但它可以处理> ANY,并且当IN子句或JOIN为更自然的选择) – Kickstart 2013-05-02 10:40:01

1

MySQL优化用途有战略此查询时,它有效地改变成类似:

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中描述。