首先,我应该指出我对SQL Server索引知之甚少。
我的情况是我有一个SQL Server 2008数据库表,其中varchar(max)列通常填充 lot 文本。
我的ASP.NET网络应用程序有一个搜索工具,可以在此列中查询关键字搜索,并根据搜索到的关键字的数量,可能是一个或多个 LIKE'%keyword%'语句在SQL查询中进行搜索。
我的Web应用程序也允许通过此表中的各个其他列进行搜索,而不仅仅是一列。其他表也有一些连接。
我的问题是,是否值得在此专栏上创建索引以提高这些搜索查询的效果?如果是这样,什么类型的索引,只是索引一列是足够的,还是我需要包括其他列,如主键和其他可搜索的列?
答案 0 :(得分:21)
我曾见过为什么索引不能帮助'%wildcard%'
搜索的最佳类比:
带两个人。递给每一本同一本电话簿。跟你左边的人说:
告诉我这本电话簿中有多少人使用姓氏"史密斯。"
现在对你右边的人说:
告诉我这本电话簿中有多少人使用第一个名字" Simon。"
索引就像电话簿。很容易寻找一开始的事情。很难扫描中间或末尾的东西。
每次我在会话中重复这一点,我都会看到灯泡继续播放,所以我认为在这里分享是有用的。
答案 1 :(得分:18)
您无法在varchar(max)字段上创建索引。索引上的最大字节数为900.如果列大于900字节,则可以创建索引,但任何超过900字节的插入都将失败。
我建议您阅读有关fulltext搜索的内容。在这种情况下它应该适合你
答案 2 :(得分:8)
如果您正在进行 LIKE'%keyword%'搜索,则无法创建常规索引。原因是索引的工作方式就像搜索字典一样,从中间开始然后分割差异直到找到单词。通配符查询就像要求您查找包含文本“to”或其他内容的单词 - 查找匹配项的唯一方法是扫描整个字典。
但是,您可以考虑使用全文搜索,这是针对此类情况(see here)。
答案 3 :(得分:0)
找出答案的最佳方法是创建一组类似于现实生活中的测试查询,并尝试在有和没有索引的情况下针对您的数据库运行它们。但是,通常,如果您正在执行许多SELECT查询和少量UPDATE / DELETE查询,则索引可能使您的查询更快。
但是,如果您进行了大量更新,索引可能会损害您的性能,因此您必须知道在做出此决定之前您的数据库必须处理哪种查询。