为什么大于where子句导致全表扫描?

时间:2013-11-27 14:08:30

标签: mysql datetime indexing database-performance

我有一张名为x的表格 与INDEX on datetime column-> eventdate

当我使用时

"where eventdate >= '2013-09-01 00:00:00'"

这个导致全表扫描。 我该怎么做才能避免全表扫描。 请帮忙。

1 个答案:

答案 0 :(得分:1)

所以你有INDEX(eventdate)但是where eventdate >= '2013-09-01 00:00:00'会进行全面扫描吗? 那么我猜大多数eventdate大于'2013-09-01 00:00:00'

你会给我们以下查询吗?

SELELCT COUNT(*) FROM x;
SELELCT COUNT(*) FROM x WHERE  eventdate >= '2013-09-01 00:00:00;
EXPLAIN SELELCT COUNT(*) FROM x WHERE  eventdate >= '2013-09-01 00:00:00;

MySQL说如下:

http://dev.mysql.com/doc/refman/5.6/en/how-to-avoid-table-scan.html

  

您正在使用具有低基数的键(许多行与键值匹配)到另一列。在这种情况下,MySQL假设通过使用密钥,它可能会执行许多键查找,并且表扫描会更快。

更新

OP已经评论如下。

Q1 : SELELCT COUNT(*) FROM x; 

Q2 : SELECT COUNT(c.id)
     FROM X c WHERE c.eventDate >= '2013-09-30 09:17:35'
     GROUP BY c.msisdn
     ORDER BY SUM(abc) DESC;

“Q1”和“Q2”都产生20,000,042行。 OP正在询问“现在请告诉我为什么它会检索所有数据”

如前所述,表x中的所有eventData都大于“2013-09-30 09:17:35”。因此检索整个数据。如果你想要前10名记录,只需添加“LIMIT”

SELECT COUNT(c.id)
FROM X c WHERE c.eventDate >= '2013-09-30 09:17:35'
GROUP BY c.msisdn
ORDER BY SUM(abc) DESC
LIMIT 10;

你查询正在进行超过20M +行的GROUP BY和ORDER BY,它需要很长时间(需要多长时间?)当更多条件添加到查询时,它会变得更快。但我不知道哪种情况是正确的(我不知道你的数据,架构,你想要什么)