sql - 在Oracle中,如果我对2列创建复合索引,那么在什么情况下会使用该索引来搜索记录?

标签 sql oracle indexing

在Oracle中,如果我对2列创建复合索引,那么在什么情况下会使用该索引来搜索记录?

a) 如果我的查询有一个涉及第一列的 WHERE 子句 例如WHEREfirst_column = '约翰'

b) 如果我的查询有一个涉及第二列的 WHERE 子句 例如WHERE secondary_column = '夏尔马'

c) a 或 b

d) a 和 b

e) 不是特别是这两列,而是可以是 WHERE 子句中的任何列。

f) 仅 a 列或 a 和 b 两列

最佳答案

我碰巧认为 MySQL 在描述如何使用复合索引方面做得非常好。文档是here .

基本思想是索引通常在以下情况下使用:

  • where条件是 col1 上的相等(col1 = value)。
  • where条件是不等式或 incol1 ( col1 in (list) , col1 < value )
  • where条件是 col1 上的相等和col2 ,通过 and 连接(col1 = val1 and col2 = val2)
  • where条件是 col1 上的相等和一个不等式或 incol2 .
  • 上述四种情况中的任何一种,其中附加列与其他列上的附加条件一起使用,并通过 and 连接.

此外,如果col1,通常会使用索引和col2是查询中唯一引用的列。这称为覆盖索引,并且——假设表中还有其他列——读取索引比原始表更快,因为索引较小。

Oracle 有一个非常智能的优化器,因此它也可能在某些相关情况下使用索引,例如当 col1 时使用in条件以及 col2 上的条件.

一般来说,如果列是函数的参数,则条件不符合索引的条件。因此,这些子句不会使用基本索引:

where month(col1) = 3
where trunc(col1) = trunc(sysdate)
where abs(col1) < 1

Oracle 支持功能索引,因此如果这些结构确实很重要,您可以在 month(col1) 上创建索引, trunc(col1) ,或abs(col1) .

此外,or往往会降低使用索引的可能性。

关于sql - 在Oracle中,如果我对2列创建复合索引,那么在什么情况下会使用该索引来搜索记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28136561/

相关文章:

使用左连接时 MySQL 限制 "main"结果?

oracle - 为什么我的光标只返回第一行?

sql - 在 Oracle SQL 中比较具有不同顺序的字符串的两列

indexing - 如何将 .PDF 文件的内容导入 Solr 索引?

我从不选择的MySQL主键

python - 将 float 分配给子集返回 1

使用 MySQL LIMIT 的 ASP.NET GridView 分页

php - 确定 sql 语句返回 true 还是 false 的正确方法是什么?

sql - MSSQL : How do you script Stored Procedure creation with code?

sql - 为什么 oracle 过程无效