7

我有一张有数百万行的表。我需要找到具有特定列值的所有行。该列不在索引中,因此会导致表扫描。

但是在头部添加一个索引(主键跟随),执行查询,然后删除索引会更快吗?

我无法永久添加索引,因为用户正在指定他们正在寻找的列。

4

8 回答 8

9

需要思考的两个问题:

  1. 可以为查询指定多少列?
  2. 数据是否经常变化?很多吗?

如果您有少量候选列,并且数据变化不大,那么您可能需要考虑在任何甚至所有候选列上添加永久索引。

亵渎神明! ”,我听到了。大多数消息来源告诉您“从不”为表的每一列编制索引,但这种建议植根于表经常修改的一般假设。

您将付出额外存储的代价,以及数据更改时的性能损失。

多小是,多是,权衡是否值得?因为“太慢”通常是一种主观衡量,所以没有办法告诉修道院。

您必须尝试一下,测量索引的大小,然后测量它们在搜索中的影响。您必须在成本与客户满意度的提高之间取得平衡。

[添加]哦,还有一件事:临时索引不仅在物理上比表扫描慢,而且会破坏您的并发性。重新索引表通常(总是?)需要一个完整的表锁,因此实际上一次只能完成一个用户搜索。

祝你好运。

于 2008-08-27T14:28:50.223 回答
8

我不是 DBA,但我猜想构建索引无论如何都需要扫描表。

除非该列上有多个查询,否则我建议不要创建索引。

不过,最好检查两种方式的解释计划/执行时间!

于 2008-08-27T13:36:07.793 回答
3

正如其他人所说,添加索引肯定不会比对该列进行完整扫描更快。

但是,我建议跟踪查询模式并找出搜索最多的列,并至少为它们添加索引。您可能会发现 3-4 个索引可以加快 90% 的查询速度。

于 2008-08-27T14:08:28.883 回答
2

添加索引需要表扫描,因此如果您不能添加永久索引,听起来单次扫描会(稍微)快一些。

于 2008-08-27T13:32:37.380 回答
2

不,那不会更快。更快的方法是添加索引并将其留在那里!

当然,索引每一列可能不切实际,但同样可以。数据如何添加到表中?

于 2008-08-27T13:33:03.230 回答
2

不会的。创建索引比简单地扫描列更复杂,即使计算复杂度相同。

也就是说 - 你有多少列?如果单个查找的查询时间太长,您确定不能只为每个索引创建一个索引吗?

于 2008-08-27T13:34:54.627 回答
2

这取决于查询的复杂性。如果您只检索一次数据,那么执行表扫描会更快。但是,如果您在同一查询中多次返回表以获取相关信息,则索引会更快。

另一个相关的策略是进行表扫描,并将所有数据放在一个临时表中。然后索引 THAT,然后您可以对索引数据的子集执行所有后续选择、分组和许多其他查询。好处是使用临时表在相关表中查找相关信息要快得多。

但是,现在空间很便宜,因此最好通过检查用户如何实际使用您的系统并在这些频繁列上添加索引来为您服务。我还没有看到用户一直使用所有的搜索参数。

于 2008-08-27T13:56:16.620 回答
2

除非您为每列添加一个永久索引,否则您的解决方案将无法扩展,查询中返回的所有列都包含在包含列的列表中(覆盖索引)。这些索引将非常大,并且对该表的插入和更新会有点慢,但是如果您允许用户任意选择搜索列,则您没有太多选择。

有多少列?数据多久更新一次?插入和更新需要多快运行?取决于对这些问题的回答,需要权衡取舍。做大量的实验和测试,这样你就可以确定事情会如何执行。

但是对于您的原始问题,仅当您在查询期间执行多个选择时,为单个查询添加和删除索引才有用(例如,选择在为返回的每一行运行的子查询中) )。

于 2008-08-27T14:39:40.573 回答