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

Mysql 为什么大于where子句导致全表扫描?,mysql,datetime,indexing,database-performance,Mysql,Datetime,Indexing,Database Performance,我有一个名为x 在datetime列上使用索引->事件日期 当我使用 "where eventdate >= '2013-09-01 00:00:00'" 这一个导致全表扫描。 我应该做什么来避免全表扫描。 请帮助。所以您有索引(eventdate)但是eventdate>='2013-09-01 00:00:00'在哪里进行完全扫描? 那么我猜大部分的eventdate都大于'2013-09-01 00:00:00' 你能告诉我们以下问题吗 SELELCT COUNT(*) FROM

我有一个名为
x
在datetime列上使用
索引->事件日期

当我使用

"where eventdate >= '2013-09-01 00:00:00'"
这一个导致全表扫描。 我应该做什么来避免全表扫描。 请帮助。

所以您有
索引(eventdate)
但是
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的说法如下:

您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,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”都产生20000042行。OP询问“现在请告诉我为什么它要检索所有数据”

如前所述,表x中的所有eventData都大于“2013-09-30 09:17:35”。这样就可以检索到整个数据。如果你想要前10条记录,只需添加“限制”


您的查询正在按超过2000万行进行分组和排序,这需要很长时间(需要多长时间?)当向查询中添加更多条件时,它会变得更快。但是我不知道哪种情况是合适的(我不知道你的数据、模式、你想要什么)

你所说的完全扫描是什么意思?你应该发布你的模式、完整查询和解释计划;将给你20000042条记录意味着所有记录。我使用的查询是-从X c中选择计数(c.id),其中c.eventDate>='2013-09-30 09:17:35'按c.msisdn分组按和排序(abc)描述;这张图也显示了解释图中的20000042。现在请告诉我为什么要检索所有数据?@Aamir我已经更新了我的答案。但它帮不了你更多。
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;