修复查询后,我遇到了严重的性能问题:

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秒内运行。

mysql - MySQL中时间戳的性能问题-LMLPHP


该测试在Stamp上执行的时间为15.564秒(REM:该查询将返回更多行是有意义的)。

Order_SG包含约3100万行。

Order_SG.Stamp定义如下:

mysql - MySQL中时间戳的性能问题-LMLPHP

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

更新

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

SHOW INDEX FROM Order_SG不返回Stamp的条目,但是有BTREECreation_DatePayment_Date索引用于创建DATE

最佳答案

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

因此,创建索引,例如

create index idx_order_sg_stamp on order_sg(stamp);


并且您的查询应该运行很快。

08-19 21:59
查看更多