【发布时间】:2014-10-16 21:45:10
【问题描述】:
假设我有一个表foo(bar:int),在bar 上有一个普通的 btree 索引,并且该表包含 100 行(bar 的值为 2 到 101)。运行以下查询时,MySQL 如何决定先执行>= 还是<=?
SELECT bar from foo where bar BETWEEN 0 AND 1
如果它执行>=,那么它将扫描所有 100 行。另一方面,如果它执行<=,它将执行 0 次扫描。有没有办法指定先做什么?
这对我来说特别重要,因为datetime 对包含多年历史数据的非常大的表进行范围查询,并且请求的时间范围接近当前时间。如果它首先执行<=,那么将对多年的数据进行大规模扫描。例如:
SELECT * from table
WHERE instant BETWEEN DATE_SUB(NOW(), INTERVAL 1 HOUR) AND DATE_SUB(NOW(), INTERVAL 1 MINUTE);
【问题讨论】:
-
如果我回答了您的问题,请接受它作为答案。谢谢:)
-
嗨,迈克尔,非常感谢您的回复。如果它回答了我的问题,我会接受,我只需要多研究一下才能理解:)
-
如果您需要更多说明,请告诉我 :)
-
需要更多时间或者你忘了我:P?说真的,如果您需要进一步澄清 - 请告诉我 :)
-
对不起,我真的很想找到一个准确的答案,我只是没有花足够的时间阅读它。我一直在重读您的答案,认为“好的,我和你在一起”,然后我在“案例”部分中丢失了它。我不确定我们指的是相同类型的“扫描”——我的意思是必须询问 mysql 记录而不是使用索引(因为对于范围,mysql 只能使用索引进行部分搜索)。这是你指的还是当你说扫描时你的意思是遍历树?
标签: mysql sql database indexing database-optimization