【问题标题】:MySQL BETWEEN query - which part uses index?MySQL BETWEEN 查询 - 哪个部分使用索引?
【发布时间】: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


【解决方案1】:

如果我正确理解您的问题:创建 B-tree 索引时,通常它是 B+tree http://en.wikipedia.org/wiki/B%2B_tree

维基百科:“一个简单的 B+ 树示例,将键 1-7 链接到数据值 d1-d7。链表(红色)允许快速按顺序遍历。”

这意味着在大约 log_b(N) 时间内找到范围中的最小元素(在您的情况下是最早的日期),然后 从 B+ 树的所有叶子有 k 跳,直到范围内的所有元素都用完。

k 是数据库中存在的范围内元素的数量,而不是所有可能的值,N 是树的高度(在 Wikipedia 示例中为 2),b 是树的分支因子(在维基百科的例子是 3)

编辑: 案例:

  • 在只有 foo

  • 在只有 foo>=0 的情况下,它不会找到 0,而是它的值中的第一个,在你的情况下它将变为 2。然后它将进行 100 次扫描

  • 当您有 'foo 0 between 40' 时,它就像 foo=0,所以它会转到第一个,在您的情况下为 2,然后执行(38hopes/scans 假设所有值都在数据库中)。也就是说,它们不是单独执行的,所以它们会一起使用索引!

一般而言,Sql 服务器有优化器,可以检测范围并通过将 AND 置于正确的顺序来重写查询。他们还跟踪查询性能,并在估算成本计划后决定要遵循的执行计划。如果您有 SQL Server,您可以通过任何查询查看所有这些计划。

【讨论】:

  • "38hopes/scans" --- 这个数字从何而来?
  • 40-2 因为你已经存储了值 2-101
  • B+Tree 是一种排序结构。为什么要按顺序扫描元素?
  • 如果索引是聚集的,则扫描将是顺序的,或者换句话说,可以在磁盘中以完全相同的顺序找到 bar 的值。如果它不是集群的,则意味着有指向硬盘中实际位置的指针。在扫描发生之前,这将涉及更多的磁盘寻道时间。我在这里省略了许多细节..我相信您在 RDBMS 方面拥有 10 年的经验也知道,但它们超出了问题的范围:)
  • [问题已删除] 是的,但在他的第二个查询中,索引不是自包含的,他需要 */所有字段,因此它会触及磁盘。如果我们在柱上有一个索引,那么只有在索引不能完全放入主内存/RAM 的情况下,我们才需要接触磁盘。
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2017-01-12
  • 2011-04-10
  • 2013-07-10
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多