选择语句需要很长时间才能完成

时间:2016-08-22 11:45:39

标签: mysql sql

我有以下查询,

SELECT  1
FROM    orderdetail               -- table orderdetail has 1420703 rows
WHERE   orderdetailstatusid != 3  -- not cancelled
AND
navdate = '20161212';

问题在于,扫描一个包含~1420703行的大表时,执行时间超过130秒。我想知道是否有办法让它快一点。

我最后尝试limit 1,但这也无济于事。

有人可以提出一些建议,如何改进?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

在表格上创建索引会使速度更快。

CREATE INDEX index_name1
ON table_name (navdate)

CREATE INDEX index_name2
ON table_name (orderdetailstatusid)

答案 1 :(得分:1)

SELECT 1

FROM orderdetail With(NOLOCK)

WHERE orderdetailstatusid!= 3 - 未取消

AND navdate ='20161212';

答案 2 :(得分:1)

并添加我的贡献:

为获得最佳表现:

首先,您应按照macco

的建议索引2列

其次,!= / <>运算符是一个性能上的杀手,比=运算符对引擎更加密集,并且可能会导致全表扫描。 如果可以,最好列出所有可能的值,而不是说与值不同。 看起来就是这种情况。所以你可以像这样重写你的查询:

SELECT  1
FROM  orderdetail               -- table orderdetail has 1420703 rows
WHERE orderdetailstatusid IN (1,2,4,5)  -- everything but cancelled
  AND navdate = '20161212';

假设您只能拥有{1,2},(1,2,3,4,5)等orderdetailstatusid值,请相应更改。