Database Oracle-我应该为选择创建哪些列的索引。。。其中s1=';xxx和x27;和(s2=';xxx';或(s2=';xxx';和s3=';xxx';)?

Database Oracle-我应该为选择创建哪些列的索引。。。其中s1=';xxx和x27;和(s2=';xxx';或(s2=';xxx';和s3=';xxx';)?,database,oracle,relational-database,Database,Oracle,Relational Database,我经常在表1上运行以下SQL: select * from table_1 where s_1 = 'xxx' and (s_2 = 'xxx' or (s_2 = 'xxx' and s_3 = 'xxx')); 如果我在表_1上创建索引以加速选择,我应该在哪些列上创建索引 如果SQL是 select * from table_1 where s_1 = 'xxx' and s_2 = 'xxx'; 索引应该加上,但是或操作符怎么样 我不是在寻找创建索引的SQL。我正在寻找一个关于如何创建

我经常在
表1
上运行以下SQL:

select * from table_1 where
s_1 = 'xxx' and
(s_2 = 'xxx' or (s_2 = 'xxx' and s_3 = 'xxx'));
如果我在
表_1
上创建索引以加速选择,我应该在哪些列上创建索引

如果SQL是

select * from table_1 where
s_1 = 'xxx' and s_2 = 'xxx';
索引应该加上
,但是
操作符怎么样


我不是在寻找创建索引的SQL。我正在寻找一个关于如何创建这样的用例的索引的解释。

< P>选择哪个列或组合的列来创建索引不是一个精确的科学,因为在每种情况下都有许多不同的因素要考虑,包括但不限于:

  • 查询性能与插入/更新/删除性能
  • 哪些列经常一起查询
  • 候选列中的数据有多大
  • 数据量和预期增长
  • 数据唯一性和倾斜
  • Oracle版本
任何说你“应该”创建任何特定索引的建议都应该是可疑的,这取决于建议者对你特定情况的了解程度

select * from table_1 where
s_1 = 'xxx' and
(s_2 = 'xxx' or (s_2 = 'xxx' and s_3 = 'xxx'));
这样的查询可能利用
(s_1)
上的索引,但部分取决于
s_1
中的数据的选择性(即唯一性)。如果这个查询非常频繁地执行,您可能会考虑一个覆盖索引,例如在(<代码> Sy1、Sy2、Sy3)上,这将允许优化器基于一个简单的索引扫描找到所有行。
select * from table_1 where
s_1 = 'xxx' and s_2 = 'xxx';
这样的查询可能会利用
(s_1,s_2)
上的索引,但这不一定是最好的索引

考虑此查询的一些替代索引策略包括:

  • (SU 2,SU 1)
  • (s_1)
    仅限
  • (s_2)
    仅限
  • (SU 1)
    (SU 2)
您选择哪种策略应该取决于上面列出的考虑因素,并结合您可以生成的最现实的数据进行测试和基准测试

关于查询谓词中的
运算符,这有时意味着只有索引的前导列(即
s_1
)将用于访问索引,然后是其他列上的筛选器。但是,优化器也可以将查询计划拆分为两个,OR谓词的每一个“边”对应一个查询计划,然后进行连接,并且这些边中的每一个都可以利用相同或不同的索引


因此,考虑的另一个潜在的索引策略是<代码>(Sy1,Sy2)<代码> >代码>(Sy1,Sy2,Sy3),或者可能只是<代码>(Sy1,Sy2,Sy3)< /C>(对<代码> Sy1 和<代码> Sy2的查询可能仍然利用后一个索引。

这是关于MySQL还是Oracle?不能两者都是,而且它们之间的语法不同。@Sloancher感谢您的更正!我将更新这个问题。这里的差异不仅仅是语法。正确地标记你的问题。@Sloachsor完成了,我把这个限制在Oracle上。