2017-08-17 15 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)创建索引。

相关问题