Database 数据库索引和组合

Database 数据库索引和组合,database,indexing,Database,Indexing,我在好几个地方读到过,您使用任何字段将查询结果限制为索引。但假设您有一个应用程序,其中不同的查询使用不同的列组合 例如,假设我们有三个查询,如下所示: 从表1中选择*字段1='A' 从表1中选择*字段1='A'和字段2='B' 从表1中选择*字段1='A'和字段3='C' 为字段1、字段2和字段3创建一个索引是否更好?或者最好为字段1创建索引,一个用于字段1和字段2的组合,另一个用于字段1和字段3的组合。在field1上创建索引将有助于所有三个查询。(field1,field2)或(field1

我在好几个地方读到过,您使用任何字段将查询结果限制为索引。但假设您有一个应用程序,其中不同的查询使用不同的列组合

例如,假设我们有三个查询,如下所示:

  • 从表1中选择*字段1='A'
  • 从表1中选择*字段1='A'和字段2='B'
  • 从表1中选择*字段1='A'和字段3='C'

  • 为字段1、字段2和字段3创建一个索引是否更好?或者最好为字段1创建索引,一个用于字段1和字段2的组合,另一个用于字段1和字段3的组合。

    field1
    上创建索引将有助于所有三个查询。
    (field1,field2)
    (field1,field3)
    上的复合索引将有助于第一次查询和第二次或第三次查询,并使
    field1
    上的非唯一索引冗余(因为复合索引可用于第一次查询)

    对于任何给定的索引,您必须权衡添加索引的成本与拥有索引的好处。索引使用空间;在添加、删除或更新行(通常)时,索引使用处理时间。如果您打算足够频繁地使用索引,并且它在使用时提供了足够的速度,那么收益大于成本。如果你很少使用索引,它可能不会为自己买单。如果表是动态的(行经常更改),则索引的更新成本将大于表相对静态的(很少更改)

    尽管优化器在有更多索引时必须更加努力(检查哪些索引是相关的),但它很少是创建或不创建索引的决定因素

    通常,请确保表上有所有相关的唯一索引


    如果您确信(因为您已经测量过)复合索引将以足够大的幅度加快速度,并且使用频率足够高,从而为您带来整体好处,请添加复合索引。

    字段1上的索引将有助于处理所有三个查询。
    (field1,field2)
    (field1,field3)
    上的复合索引将有助于第一次查询和第二次或第三次查询,并使
    field1
    上的非唯一索引冗余(因为复合索引可用于第一次查询)

    对于任何给定的索引,您必须权衡添加索引的成本与拥有索引的好处。索引使用空间;在添加、删除或更新行(通常)时,索引使用处理时间。如果您打算足够频繁地使用索引,并且它在使用时提供了足够的速度,那么收益大于成本。如果你很少使用索引,它可能不会为自己买单。如果表是动态的(行经常更改),则索引的更新成本将大于表相对静态的(很少更改)

    尽管优化器在有更多索引时必须更加努力(检查哪些索引是相关的),但它很少是创建或不创建索引的决定因素

    通常,请确保表上有所有相关的唯一索引

    如果你有信心(因为你已经衡量过)它们会以足够大的幅度加速事情,并且会经常使用,给你带来整体利益,那么就添加综合指数