3

背景:我有一个包含 500 万个地址条目的表格,我想搜索不同的字段(客户姓名、联系人姓名、邮编、城市、电话...),最多 8 个字段。数据相当稳定,一天最多修改50次,所以几乎只有读权限。

用户不应该提前告诉我他在搜索什么,我还希望支持组合搜索(搜索词的 AND 连接)。例如,“lincoln+lond”应在任何搜索字段中搜索包含两个搜索词的所有记录,以及以任何词开头的条目(如本例中的“London”)。

问题:现在我需要为这个搜索表选择一个索引策略。(附带说明:我正在尝试实现亚秒级响应时间,最差响应时间应该是 2 秒。)在性能方面更好的是:

  1. 从所有可查询的列中做一个组合索引(需要 2 个,因为达到了 900 字节的索引限制)
  2. 在每个可查询列上放置单个索引
  3. 在可查询列上建立全文索引并使用全文查询

我放弃了第 1 点,因为它似乎没有任何优势(索引使用会受到限制,并且不会有“索引搜索”,因为并非所有字段都适合一个索引)。

问题:现在,我应该使用多个单索引变体还是应该使用全文索引?有没有其他方法可以实现上述功能?

4

4 回答 4

3

两者都试一下,看看哪个在您的系统上更快。数据库优化几乎没有硬性规定,这实际上取决于您的环境。

于 2009-03-31T18:42:47.130 回答
2

最初,我正要建议使用FTS,因为它具有许多强大的性能特性。尤其是在处理各种查询时。(例如 x AND y。x NEAR y 等)。

但在开始讨论 FTS 的专业人士之前,我刚刚检查了您的服务器版本 -> sql2000。

可怜的东西。FTS 那时非常简单,所以坚持使用多个单一索引

我们使用 Sql2008 并且......它摇滚。

哦,顺便说一句。你知道Sql2008(免费版)里面有FTS吗?是否可以升级?

如果可以的话,从 sql2000 -> sql2008 开始是非常值得的。

但是,是的,坚持使用您的 MSI 选项。

于 2009-05-04T11:58:05.320 回答
1

我同意 Grauenwolf 的观点,我想添加一个关于索引的注释。请记住,如果您使用如下语法:

SELECT field1, field2, field3
FROM table
WHERE field1 LIKE '%value%

然后在field1上搜索时无论如何都不会使用任何索引,您必须求助于全文索引。为了完整起见,上述语法返回field1包含的所有行(不一定在开头)。如果您必须搜索“包含”,则全文索引可能更合适。

于 2009-04-15T13:24:46.597 回答
1

回答我自己的问题:

我选择了“多个单一索引”选项。我最终为每个查询的列建立了一个索引,每个索引只包含列本身。搜索效果非常好,响应时间大多为亚秒级。有时它需要 2-3 秒,但我将其归因于我的数据库服务器(具有 3GB 内存和慢速磁盘的几年前的笔记本电脑)。

我没有测试全文选项,因为它不再需要(而且我没有时间去做。)

于 2009-05-04T11:39:18.953 回答