假设我有Products表。
在我的UI上,我允许用户按名称,描述和代码进行搜索 用户只能搜索条件。
我应该为每个条件创建索引:名称,描述,代码 或者为所有3个创建单个索引?
什么会让你选择一个与另一个?
答案 0 :(得分:9)
每当您在多个列上构建索引时,例如create index .. on T(A, B, C)
,如果指定了最左侧的列,则只能使用 。如果搜索列A
,则可以使用索引。如果您搜索列A
和 B
,则可以使用索引。如果您搜索列A
和 B
和 C
,则可以使用索引。但是,如果您只搜索列B
,或仅搜索列C
,则不仅在B
列和C
列上。
因此,如果要在代码上的描述或上搜索产品或,则需要在每个上单独编制索引。如果要在三列的任何中搜索术语,则很可能需要全文搜索。同样适用于描述,你不太可能想要一个正常的索引,很可能你需要一个全文索引。
答案 1 :(得分:8)
每个都需要一个索引。所有三个指数的一个指数只会使涉及索引中第一个标准的搜索受益,或者与第二个标准结合使用,等等。
答案 2 :(得分:3)
答案是:这取决于。
优化器的决定是基于表格的统计数据,后面是表格和列表中列的索引。查询。强制索引并不能确保最有效/最佳的查询...
您所能做的就是使用实际执行计划针对最可能的查询测试各种索引方法(子树成本越低越好),并选择最适合您的方法。
答案 3 :(得分:1)
如果限制搜索使用starts-with字符串匹配模式('search%'),那么您需要该列的索引。此索引是有序数据,可以seeked
查找第一个匹配项,并持续读取,直到它到达最后一个匹配项。
如果您有一个不受约束的搜索模式('%search%'),或者允许查看三列的任意组合,则需要一个索引来存储所有三个。此索引是列的副本,可能比原始表快scanned
。
一如既往,衡量措施和措施
SET STATISTICS IO ON
SET STATISTICS TIME ON
答案 4 :(得分:1)
其他正确,您需要每列的索引。但是,我想再添加两件事:
无论您如何订购结果,单个索引(每列)就足够了(ASCending,DESCending)
对于标题和说明等列,您可能需要考虑全文搜索,而不是常规的SQL比较和LIKE过滤器。