2013-05-02 55 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中描述。