背景:我有一个包含500万个地址条目的表格,我想搜索不同的字段(客户名称,联系人姓名,邮编,城市,电话......),向上到8个领域。数据非常稳定,每天最多50次更改,因此几乎只有读取权限。
用户不应该提前告诉我他正在搜索什么,我也希望支持组合搜索(搜索术语的AND连接)。例如,“lincoln + lond”应该搜索在任何搜索字段中包含搜索词的所有记录,也包括以任何词开头的条目(例如本例中的“伦敦”)。
问题:现在我需要为此搜索表选择索引策略。 (作为旁注:我正在努力实现亚秒响应时间,最差的响应时间应该是2秒。)在性能方面有什么好处:
我放弃了第1点,因为它似乎没有任何优势(索引使用将受到限制,并且不会有“索引搜索”,因为并非所有字段都适合单个索引)。
问题:现在,我应该使用多个单一索引变体,还是应该使用全文索引?是否有任何其他方式来实现上述功能?
答案 0 :(得分:3)
尝试两者,看看哪个系统更快。数据库优化的硬性和快速规则很少,它实际上取决于您的环境。
答案 1 :(得分:2)
最初,我打算建议使用 FTS ,因为它有很多强大的性能功能。特别是当你处理各种查询时。 (例如,x和y。x NEAR y等)。
但在我开始与FTS的专业人士闲聊之前,我刚检查了你的服务器版本 - > SQL2000。
可怜的事情。那时FTS非常简单,所以坚持使用多个单索引。我们使用Sql2008并且......它摇滚。
哦,顺便问一下。你知道Sql2008(免费版)里面有FTS吗?有可能升级吗?
从sql2000开始 - > sql2008非常值得,如果可以的话。
但是,坚持你的M.S.I.选项。
答案 2 :(得分:1)
我同意Grauenwolf,我想补充一下关于索引的说明。请记住,如果您使用如下语法:
SELECT field1, field2, field3
FROM table
WHERE field1 LIKE '%value%
在搜索 field1 时,无论如何都不会使用任何索引,您必须求助于全文索引。为了完整起见,上述语法返回 field1 包含 value 的所有行(不一定在开头)。 如果您必须搜索“包含”,则全文索引可能更合适。
答案 3 :(得分:1)
回答我自己的问题:
我选择了“多个单一索引”选项。我结束了每个查询列的索引,每个索引只包含列本身。搜索工作非常好,主要是亚秒响应时间。有时它需要2-3秒,但我将它归因于我的数据库服务器(几年前使用3GB Ram和慢速磁盘的笔记本电脑)。
我没有测试全文选项,因为它不再需要(我没有时间去做。)