16

首先,我应该指出我对 SQL Server 索引了解不多。

我的情况是我有一个 SQL Server 2008 数据库表,它有一个 varchar(max) 列,通常填充很多文本。

我的 ASP.NET Web 应用程序有一个搜索工具,可以查询此列以进行关键字搜索,并且根据搜索的关键字的数量,它们可能是 SQL 查询中的一个或多个LIKE '%keyword%'语句来进行搜索。

我的 Web 应用程序还允许按此表中的各种其他列进行搜索,而不仅仅是那一列。还有一些来自其他表的连接。

我的问题是,是否值得在此列上创建索引以提高这些搜索查询的性能?如果是这样,什么类型的索引,仅索引一列就足够了,还是我需要包括其他列,例如主键和其他可搜索列?

4

4 回答 4

32

我见过的关于为什么索引无助于'%wildcard%'搜索的最佳类比:

带两个人。递给每个人相同的电话簿。对你左边的人说:

告诉我这本电话簿中有多少姓“史密斯”的人。

现在对你右边的人说:

告诉我这本电话簿中有多少人的名字是“西蒙”。

索引就像电话簿。很容易寻找一开始的东西。很难扫描到中间或末尾的东西。

每次我在会话中重复此操作时,我都会看到灯泡亮起,所以我认为在这里分享可能会有用。

于 2012-05-03T00:21:54.433 回答
20

您不能在 varchar(max) 字段上创建索引。索引的最大字节数为 900。如果列大于 900 字节,您可以创建索引,但任何超过 900 字节的插入都将失败。

我建议您阅读全文搜索。在这种情况下它应该适合你

于 2012-05-02T23:07:16.400 回答
10

如果您正在执行LIKE '%keyword%'搜索,则不值得创建常规索引。原因是索引的工作方式就像搜索字典一样,从中间开始,然后拆分差异,直到找到单词。该通配符查询就像要求您查找包含文本“to”或其他内容的单词 - 查找匹配项的唯一方法是扫描整个字典。

但是,您可能会考虑使用全文搜索,它适用于这种情况(请参阅此处)。

于 2012-05-02T23:00:45.597 回答
0

找出答案的最好方法是创建一堆类似于现实生活中发生的测试查询,并尝试在有和没有索引的情况下针对您的数据库运行它们。但是,一般来说,如果您正在执行许多 SELECT 查询和很少的 UPDATE/DELETE 查询,则索引可能会使您的查询更快。

但是,如果您进行大量更新,索引可能会损害您的性能,因此您必须在做出此决定之前知道您的数据库必须处理什么样的查询。

于 2012-05-02T22:59:23.627 回答