2014-09-25 186 views
0

下面的查詢:MySQL查詢不使用索引

EXPLAIN 
SELECT 
    fdb . * , 
    TIME_FORMAT(fdb.scheme, '%H:%i') AS scheme, 
    TIME_FORMAT(fdb.actual, '%H:%i') AS actual, 
    TIME_FORMAT(fdb.baggage, '%H:%i') AS baggage, 
    TIME_FORMAT(fdb.baggage_handled, '%H:%i') AS baggage_handled, 
    ff . * , TIME_FORMAT(ff.actual_saved, '%H:%i') AS actual_saved, 
    TIME_FORMAT(ff.baggage_saved, '%H:%i') AS baggage_saved, 
    TIME_FORMAT(ff.baggage_handled_saved, '%H:%i') AS baggage_handled_saved, 
    ap.device_id, 
    ap.device_token, 
    ap.device_language, 
    ap.app_edition, 
    ap.receive_status_notifications, 
    ap.receive_time_notifications, 
    ap.receive_luggage_notifications, 
    ap.receive_gate_notifications, 
    ap.receive_runway_notifications, 
    ap.receive_plane_notifications 
FROM flights_database fdb 
    JOIN flights_followed ff ON fdb.flight_id = ff.flight_id 
    JOIN apns_users ap ON ff.device_id = ap.device_id 
         AND ap.app_edition = '1' 

使用說明後,很明顯的查詢使用表掃描: enter image description here

有各種按鍵和pusher_idx同時包含device_idflight_id 。爲什麼這個索引不被使用?

+0

我認爲索引只能用作索引,當你只引用索引字段。如果您從同一個表中加入非索引字段,則會進行掃描。也期望函數調用將索引分解爲掃描。 – Pieter21 2014-09-25 22:03:50

+0

'SHOW CREATE TABLE \'apns_users \';','SHOW CREATE TABLE \\ flights_followed \';' – Sebas 2014-09-25 22:22:46

回答

0

在這種情況下,MySQL優化改變了你的表的順序(它可以做到這一點 - 他們都是INNER JOINS):

SELECT 
    ... 
FROM flights_followed ff 
    JOIN flights_database fdb ON fdb.flight_id = ff.flight_id 
    JOIN apns_users ap ON ff.device_id = ap.device_id 
         AND ap.app_edition = '1' 

因此,一旦flights_followed不受任何自己的謂詞過濾(用新加盟爲了加入其他表格,加入了其他表格,因此它們被過濾) - 它決定執行全面掃描。

+0

所以我沒辦法解決這個問題? – edwardmp 2014-09-26 00:28:40

+0

@edwardmp:解決「什麼」?您請求完整掃描 - mysql執行它。如果你不想要一個完整的掃描 - 爲'ff'添加一些謂詞到'WHERE'(或相關的'ON') – zerkms 2014-09-26 01:07:03

+0

我誤解了。謝謝。在ff上添加一個WHERE仍然使用表掃描:( – edwardmp 2014-09-26 15:31:40