我有一张名为x
的表格
与INDEX on datetime column-> eventdate
。
当我使用时
"where eventdate >= '2013-09-01 00:00:00'"
这个导致全表扫描。 我该怎么做才能避免全表扫描。 请帮忙。
答案 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假设通过使用密钥,它可能会执行许多键查找,并且表扫描会更快。
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,它需要很长时间(需要多长时间?)当更多条件添加到查询时,它会变得更快。但我不知道哪种情况是正确的(我不知道你的数据,架构,你想要什么)