RDBS什么时候使用复杂的索引进行查询和何时使用简单?

时间:2009-05-18 08:23:48

标签: sql performance indexing rdbms

假设我的数据库模式中有一个名为TEST的表,其中包含字段(id,name,address,phone,comments)。现在,我知道我将为该表执行大量不同的查询,因此我的问题是下一个,何时以及为什么我将创建ID_NAME_INDX(id和name的索引)以及何时创建更高效​​的索引单独索引名称字段的id和索引(当我的意思是什么类型的查询时)?

3 个答案:

答案 0 :(得分:1)

一般目标是“覆盖”所有列,以便查询只需使用索引。

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

假设您需要名称和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上的索引,包括地址的名称将“覆盖”它。

使用“OR”会给任何策略带来困难。但是,

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

仍然会尽可能使用“ID,包括地址的名称”,但扫描它而不是搜索

阅读本文:Execution Plan Basics

答案 1 :(得分:1)

我不确定你的例子是否解释了你所问的实际问题。你是说你应该在ID和索引上有一个索引,而不是ID和Name上的索引。问题是,我猜这个ID是你的主键,因此你不太可能在ID和名称上进行搜索。

但是,对于一个有两个ID的表,你想要在其中一个或两个一起搜索,然后有三个索引,每个ID和一个组合上的一个将是最快的。如果你有两个索引然后找到你正在寻找的记录,则需要搜索两个索引。但是,如果您有一个索引覆盖两个ID,那么只需要搜索该索引。

与所有索引一样,当您添加它们时,您的数据库的大小会增加,您的插入/更新性能会降低。你总是需要权衡收益/损失。

将索引添加到绝对明显的候选者中,在需要时将索引添加到“可能”的索引中。继续监视数据库性能并运行查询分析器,以查看可以在一段时间内取得哪些性能提升。

答案 2 :(得分:0)

大多数数据库软件都包含某种调试查询的工具。这些通常可以告诉您服务器考虑的哪些索引以及最终使用的索引。此功能通常称为解释或类似的东西。

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