【问题标题】:How does the "AND" operator work when search using an index?使用索引进行搜索时,“AND”运算符如何工作?
【发布时间】:2021-05-10 22:10:22
【问题描述】:

例如:

SELECT * FROM posts WHERE owner="abc" AND status="public"

ownerstatus 都有索引。

子句WHERE owner="abc" 可以使用带有B-tree 的索引来有效地搜索owner 等于abc 的帖子(如果我错了,请纠正我)。

但它不会止步于此,它还应该进一步查找AND status="public" 条件,我的问题是数据库引擎如何有效地执行此额外查找?或者它可能只是对WHERE owner="abc" 的结果集进行全面扫描?

我很好奇数据库引擎如何有效地处理这样的查询。

【问题讨论】:

标签: sql database-indexes


【解决方案1】:

在您的情况下,MySQL(或任何其他现代数据库)将只使用一个索引。

假设您有一本书,其中有两个索引:一个按章节索引,位于书的开头,另一个按关键字索引,通常位于书尾。

第3章的页面很容易找到,关键字“递归”的页面很容易找到。但是,如果您需要在第 3 章中找到递归页面,那么分开的两个不同索引并没有真正的帮助。

数据库的工作方式是这样的——它们为每个索引都有一个有序集,引用行。但是,对于给定的用户,没有基于其他列的索引/排序。

正如人们在 cmets 中指出的那样,答案是由多个列组成的索引。在你的情况下,你会:

CREATE INDEX idx ON posts (owner, status);

在这种情况下,您告诉数据库创建一个按所有者排序的索引,并在同一所有者中按状态排序。所以现在您有了查询所需的内容 - 一个按两列过滤的索引。

您也可以查找EXPLAIN 命令。在这种情况下,您向数据库询问它是如何计划执行查询的:例如,将使用哪些索引。

【讨论】:

  • 我喜欢你的例子。
猜你喜欢
  • 2011-01-21
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2017-09-20
  • 2022-11-13
  • 2021-01-03
  • 1970-01-01
相关资源
最近更新 更多