代码之家  ›  专栏  ›  技术社区  ›  Artem Barger

RDB何时使用复杂索引进行查询,何时使用简单索引?

  •  1
  • Artem Barger  · 技术社区  · 16 年前

    假设我的DB模式中有一个名为TEST的表,其中包含字段(id、名称、地址、电话、注释)。现在,我知道我将对该表执行大量不同的查询,因此我的问题是,我将在何时以及为什么创建像ID\u NAME\u INDX(ID和NAME的索引)这样的索引,以及何时单独创建ID的索引和NAME字段的索引更有效(我指的是什么类型的查询)?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Robin Day    16 年前

    我不确定你的例子是否解释了你所问的实际问题。你是说你是否应该在ID和Name上建立索引,而不是在ID和Name上建立索引。问题是,我猜ID是你的主键,所以你不太可能在ID和名字上搜索。

    但是,与所有索引一样,添加索引时,数据库的大小会增加,插入/更新性能也会降低。你总是需要权衡得失。

        2
  •  1
  •   gbn    16 年前

    总体目标是“覆盖”所有列,因此查询只需使用索引。

    -- An index on Name including ID would be ideal
    SELECT
        [id]
    FROM
        TEST
    WHERE
        [name] = 'bob'
    

    假设您需要name和indx,但有单独的索引。您将通过从索引到PK的书签查找来获得其他列(假设它不只是扫描PK)

    select * from test where id='id1' and name='Name1'
    

    对于此查询,SELECT*会减轻对任何索引的影响,因此将使用PK。

    select address from test where id='id1' and name='Name1'
    

    然后ID上的索引,包括地址在内的名称将“覆盖”它。

    使用“或”会给任何策略带来困难。然而

    从id='id1'和name='Name1'所在的测试中选择地址
    

    Execution Plan Basics

        3
  •  0
  •   lhahne    16 年前

    通常,您应该为where子句或联接中使用的列创建索引。