= '2013-09-01 00:00:00'" 这-6ren">
gpt4 book ai didi

mysql - 为什么where子句中的大于会导致全表扫描?

转载 作者:行者123 更新时间:2023-11-29 13:25:12 25 4
gpt4 key购买 nike

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

当我使用时

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

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

最佳答案

所以您有 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

You are using a key with low cardinality (many rows match the key value) through another column. In this case, MySQL assumes that by using the key it probably will do many key lookups and that a table scan would be faster.

更新

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,它需要很长的时间(需要多长时间?)当更多的条件添加到查询中时,它会变得越来越快。但我不知道哪个条件合适(我不知道你的数据、模式、你想要什么)

关于mysql - 为什么where子句中的大于会导致全表扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com