MySql中的时间戳的性能问题

时间:2016-02-11 09:07:18

标签: mysql sql performance timestamp

我在修复查询后面临严重的性能问题:

SELECT 
    ...
    IF (Order_SG.Payment_Date = '0000-00-00', Order_SG.Creation_Date, Order_SG.Payment_Date) AS `DATE`,
    ...
FROM Order_SG
    INNER JOIN Customer USING (Customer__)
    INNER JOIN Order_SG_Detail USING (Order_SG__)
    INNER JOIN Product_Ref USING (Product_Ref__)
    INNER JOIN Reduction USING (Reduction__)
WHERE ...
    -- AND DATE BETWEEN '2016-02-10 00:00:00' AND '2016-02-11 00:00:00'
    AND Order_SG.Stamp BETWEEN '2016-02-10 00:00:00' AND '2016-02-11 00:00:00'
    LIMIT 2000
    OFFSET 0;

之前 测试在DATE上进行,查询将在0.174秒内完成。

enter image description here

测试在15.564秒内在Stamp上执行(REM:有意义的是查询会返回更多行)。

Order_SG包含大约3100万行。

Order_SG.Stamp定义如下:

enter image description here

我有什么选择?如何解决此性能问题?

更新

我修正了2016-02 23:59:59错字并重新检查了我的号码。我已经更新了上面的数据。

SHOW INDEX FROM Order_SG不会返回Stamp的条目,但BTREECreation_Date的{​​{1}}索引用于创建Payment_Date }。

1 个答案:

答案 0 :(得分:3)

stamp上没有索引。因此,DBMS必须从表中读取记录以便检查它是否合适。使用stamp上的索引,它可以通过索引选择适当的记录。

所以创建索引,例如

create index idx_order_sg_stamp on order_sg(stamp);

,您的查询应该快速运行。

相关问题