假设我的数据库模式中有一个名为 TEST 的表,其中包含字段(id、name、address、phone、comments)。现在,我知道我将为该表执行大量不同的查询,因此我的问题是下一个,何时以及为什么要创建像 ID_NAME_INDX(id 和名称的索引)这样的索引以及何时创建更有效分别索引 id 和索引 name 字段(当我的意思是什么类型的查询时)?
3 回答
一般目标是“覆盖”所有列,因此查询只需使用索引。
-- 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 上的索引,包括地址在内的名称将“覆盖”它。
使用“OR”会给任何策略带来困难。然而,
select address from test where id='id1' and name='Name1'
仍然最有可能使用“ID,名称,包括地址” inex,但扫描它而不是寻找
阅读本文:执行计划基础
我不确定您的示例是否解释了您要问的实际问题。你是说你是否应该在 ID 和 Name 上有一个索引,而不是在 ID 和 Name 上都有一个索引。问题是,我猜 ID 是您的主键,因此您不太可能对 ID AND Name 进行搜索。
但是,就具有两个 ID 的表而言,您希望在其中一个上搜索,或者同时搜索两个 ID,然后具有三个索引,每个 ID 上一个,一个结合起来将是最快的。如果您有两个索引,那么要查找您要查找的记录,则需要搜索两个索引。但是,如果您有一个涵盖两个 ID 的索引,则只需搜索该索引。
与所有索引一样,当您添加它们时,您的数据库会增加大小,并且您将降低插入/更新性能。您总是需要权衡收益/损失。
向绝对明显的候选者添加索引,在需要时向“可能”的候选者添加索引。继续监控您的数据库性能并运行查询分析器,以查看随着时间的推移可以在哪里获得任何性能提升。
大多数数据库软件都包含某种工具来调试您的查询。这些通常可以告诉您服务器考虑了哪些索引以及最终使用了哪些索引。此功能通常称为解释或类似名称。
通常您应该为 where 子句或连接中使用的列创建索引。