代码之家  ›  专栏  ›  技术社区  ›  svrist

具有多列的索引-仅对一列执行查询时是否确定?

  •  11
  • svrist  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  19
  •   Matt Huggins    16 年前

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

    编辑:

        2
  •  9
  •   David Aldridge    16 年前
        3
  •  2
  •   Sune Rievers    16 年前

    我想 id

    将唯一索引添加到 text ,如果你真的需要它,否则就用它 身份证件

    如果 身份证件

    关于上一个关于查找的示例 col2 ,我想你可能需要另一个索引。索引并不是解决性能问题的万灵丹,但有时您的数据库设计或查询需要优化,例如,重写到存储过程中(虽然我不完全确定Oracle是否有索引,但我确定有Oracle的等效索引)。

        4
  •  2
  •   Nick Pierpoint    16 年前

    如果问题背后的驱动因素是您有一个包含多个列的表,并且这些列的任何组合都可以在查询中使用,那么您应该查看位图索引。

    看看你的例子:

    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)上使用单个索引可能更可取。和以往一样,这要视情况而定。查看您的数据,以及可能针对该数据的查询,并确保您的统计数据是最新的。