具有多列的索引 - 在仅对一列进行查询时可以吗?

时间:2009-12-08 08:06:43

标签: sql oracle indexing

如果我有桌子

create table sv ( id integer, data text )

和索引:

create index myindex_idx on sv (id,text)

如果我进行查询,这仍然有用吗

select * from sv where id = 10

我的理由是,我正在查看一组没有任何索引的表,并查看选择查询的不同组合。有些只使用一列其他有多个列。我是否需要为两个集合建立索引,或者是一个包罗万象的索引吗? 我正在添加索引以便比全表扫描更快地查找。

示例(根据Matt Huggins的回答):

select * from table where col1 = 10
select * from table where col1 = 10 and col2=12
select * from table where col1 = 10 and col2=12 and col3 = 16

可以全部由索引表(co1l1,col2,col3)覆盖,但

select * from table where col2=12

需要另一个索引吗?

4 个答案:

答案 0 :(得分:19)

它应该是有用的,因为(id,text)上的索引首先按id分别,然后分别是文本。

  • 如果按id查询,将使用此索引。
  • 如果您通过ID&文本,将使用此索引。
  • 如果按文字查询,则不会使用此索引。

编辑:当我说它“有用”时,我的意思是它在查询速度/优化方面很有用。正如Sune Rievers所指出的那样,并不意味着只有ID就会得到一个独特的记录(除非你在表定义中指定ID是唯一的。)

答案 1 :(得分:9)

Oracle支持多种使用索引的方法,您应该从了解所有索引开始,所以请快速阅读:http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#sthref973

如果前导列的基数非常低,则查询select * from table where col2=12可以有效地利用索引跳过扫描,如果不是,则可以使用快速完整索引扫描。这些可能适用于运行报告,但是对于OLTP查询,您可能会更好地创建以col2作为前导列的索引。

答案 2 :(得分:2)

我认为id是主键。向索引添加主键没有意义,因为它始终是唯一的。添加一些独特的东西也是独一无二的。

如果您真的需要,请为text添加唯一索引,否则只需使用id就是该表的唯一性。

如果id不是您的主键,那么您将无法保证从查询中获得唯一的结果。

关于您在col2上查找的最后一个示例,我认为您可能需要另一个索引。索引不是解决性能问题的万能解决方案,有时您的数据库设计或查询需要进行优化,例如重写到存储过程中(虽然我不完全确定Oracle有它们,但我确定有Oracle当量)。

答案 3 :(得分:2)

如果您的问题背后的驱动程序是您有一个包含多个列的表,并且这些列的任意组合可能在查询中使用,那么您应该查看BITMAP索引。

看看你的例子:

select * from mytable where col1 = 10 and col2=12 and col3 = 16

您可以创建3个位图索引:

create bitmap index ix_mytable_col1 on mytable(col1);
create bitmap index ix_mytable_col2 on mytable(col2);
create bitmap index ix_mytable_col3 on mytable(col3);

这些位图索引具有很大的好处,可以根据需要组合

因此,以下每个查询都将使用一个或多个索引:

select * from mytable where col1 = 10;

select * from mytable where col2 = 10 and col3 = 16;

select * from mytable where col3 = 16;

因此,位图索引可能是您的选择。但是,正如David Aldridge指出的那样,根据您的特定数据集,(col1,col2,col3)上的单个索引可能更可取。一如既往,这取决于。查看您的数据,针对该数据的可能查询,并确保您的统计信息是最新的。

希望这有帮助。