组合索引与多个单索引与全文索引的查询性能

Posted

技术标签:

【中文标题】组合索引与多个单索引与全文索引的查询性能【英文标题】:Query performance of combined index vs. multiple single indexes vs. fulltext index 【发布时间】:2009-03-31 18:35:47 【问题描述】:

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

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

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

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

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

问题:现在,我应该使用多个单一索引变体还是应该使用全文索引?是否有任何其他方式来实现上述功能?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

我们使用 Sql2008 并且......它很棒。

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

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

但是,是的,坚持你的 M.S.I.选项。

【讨论】:

【参考方案3】:

我同意 Grauenwolf 的观点,我想补充一下关于索引的说明。请记住,如果您使用如下语法:

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

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

【讨论】:

【参考方案4】:

回答我自己的问题:

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

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

【讨论】:

以上是关于组合索引与多个单索引与全文索引的查询性能的主要内容,如果未能解决你的问题,请参考以下文章

名词解释与区分聚集索引非聚集索引主键索引唯一索引普通索引前缀索引单列索引组合索引全文索引覆盖索引

索引常识

Mysql索引以及优化

mysql索引

mysql-索引

MySQL数据库的索引类型