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