如果我有桌子
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
需要另一个索引吗?
答案 0 :(得分:19)
它应该是有用的,因为(id,text)上的索引首先按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)上的单个索引可能更可取。一如既往,这取决于。查看您的数据,针对该数据的可能查询,并确保您的统计信息是最新的。
希望这有帮助。