2017-08-17 17 views
0

我有一個查詢,用於檢查vehicles的庫存,這些庫存在一週內沒有看到,但未在sold_vehicles表中列出。將> =更改爲<=會導致查詢超出執行時間限制

如果我運行此查詢:

SELECT all_vehicles.Vin 
    FROM all_vehicles 
    LEFT JOIN sold_vehicles 
    ON all_vehicles.Vin = sold_vehicles.Vin 
    WHERE 
    sold_vehicles.id IS NULL  AND 
    all_vehicles.last_seen >= 1502672069 
    ORDER BY all_vehicles.id ASC 
    LIMIT 1000 

,一切工作正常。

但是,如果我將>=轉換爲<=,它將超過120秒的執行時間限制。爲什麼要扭轉這種表現呢?任何其他的原因,除了很多結果返回,並不會限制修復?

需要明確的是,這幾乎是完全相同的查詢,但<=LIMIT 10但無法執行:

SELECT all_vehicles.Vin 
    FROM all_vehicles 
    LEFT JOIN sold_vehicles 
    ON all_vehicles.Vin = sold_vehicles.Vin 
    WHERE 
    sold_vehicles.id IS NULL  AND 
    all_vehicles.last_seen <= 1502672069 
    ORDER BY all_vehicles.id ASC 
    LIMIT 10 

任何想法?是單獨發現的結果量?除了LIMIT以外,我該如何解決?

+0

可能是沒有記錄匹配,所以查詢仍然掃描整個表。 – Matt

+0

檢查你的指數範圍。檢查'EXPLAIN'。 – tadman

回答

1

從刪除order by開始。這會返回什麼嗎?

SELECT av.Vin 
FROM all_vehicles av LEFT JOIN 
    sold_vehicles sv 
    ON av.Vin = sv.Vin 
WHERE sv.id IS NULL AND 
     av.last_seen <= 1502672069 
--ORDER BY av.id ASC 
LIMIT 10; 

然後,我將在all_vehicles(last_seen, Vin, id)sold_vehicles(Vin, id)創建索引。

相關問題