我在修复查询后面临严重的性能问题:
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秒内完成。
后
测试在15.564秒内在Stamp
上执行(REM:有意义的是查询会返回更多行)。
Order_SG
包含大约3100万行。
Order_SG.Stamp
定义如下:
我有什么选择?如何解决此性能问题?
更新
我修正了2016-02 23:59:59
错字并重新检查了我的号码。我已经更新了上面的数据。
SHOW INDEX FROM Order_SG
不会返回Stamp
的条目,但BTREE
和Creation_Date
的{{1}}索引用于创建Payment_Date
}。
答案 0 :(得分:3)
stamp
上没有索引。因此,DBMS必须从表中读取记录以便检查它是否合适。使用stamp
上的索引,它可以通过索引选择适当的记录。
所以创建索引,例如
create index idx_order_sg_stamp on order_sg(stamp);
,您的查询应该快速运行。