繁体   English   中英

索引将改善varchar(max)查询性能,以及如何创建索引

[英]Will indexing improve varchar(max) query performance, and how to create index

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

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

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

我的Web应用程序还允许按此表中的其他各个列进行搜索,而不仅限于该列。 其他表也有一些联接。

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

对于索引为什么无法帮助'%wildcard%'搜索,我见过的最好的比喻:

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

告诉我此电话簿中有多少人的姓氏为“ Smith”。

现在对右边的人说:

告诉我这本电话簿中有多少人叫“ Simon”。

索引就像电话簿。 很容易找到开始的东西。 扫描中间或结尾的东西非常困难。

每次在会话中重复此操作时,都会看到灯泡点亮,因此我认为在此处分享可能会很有用。

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

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

如果要进行“%keyword%”搜索,则不值得创建常规索引。 原因是索引的工作方式类似于搜索字典,从中间开始,然后拆分差异,直到找到单词为止。 通配符查询就像要求您查找包含文本“ to”或某物的单词一样,查找匹配项的唯一方法是扫描整个词典。

但是,您可能会考虑进行全文搜索,这是针对这种情况的( 请参阅此处 )。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM