【问题标题】:why greater than in where clause causing full table scan?为什么大于 where 子句导致全表扫描?
【发布时间】:2013-11-27 14:08:30
【问题描述】:

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

当我使用时

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

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

【问题讨论】:

  • 全扫描是什么意思?
  • 您应该发布您的架构、完整查询和解释计划。

标签: mysql datetime indexing database-performance


【解决方案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;

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

【讨论】:

  • 从 x 中选择计数(*);会给你20000042条记录意味着所有记录。我正在使用的查询是 - 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;而这个在解释计划中也显示了相同的数字 20000042。现在请告诉我为什么它要检索所有数据?
  • @Aamir 我已经更新了我的答案。但它对您无能为力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2018-10-15
  • 2013-02-10
  • 2020-02-26
相关资源
最近更新 更多