是否有必要为文本列提供两个全文索引?

时间:2013-03-08 15:53:15

标签: mysql full-text-search full-text-indexing fulltext-index

我继承了使用MySQL和PHP构建的自定义CMS的代码库,它使用全文索引来搜索内容(文本)字段。在分析数据库结构时,我发现所有相关表都是以下列方式创建的(简化示例):

CREATE TABLE `stories` (
  `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `headline` varchar(255) NOT NULL DEFAULT '',
  `subhead` varchar(255) DEFAULT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`story_id`),
  FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`),
  FULLTEXT KEY `headline` (`headline`),
  FULLTEXT KEY `subhead` (`subhead`),
  FULLTEXT KEY `content` (`content`)  
) ENGINE=MyISAM;

正如您所看到的,全文索引是以通常的方式创建的,但是每个列也会单独添加,我相信会创建两个不同的索引。

我已经联系了之前的开发人员,他说这是创建全文索引的“正确”方法,但根据我在互联网上找到的每一个例子,都没有这样的要求,这就足够了:

CREATE TABLE `stories` (
  `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `headline` varchar(255) NOT NULL DEFAULT '',
  `subhead` varchar(255) DEFAULT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`story_id`),
  FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`)
) ENGINE=MyISAM;

该表有超过80,000行,并且变得越来越难以管理(完整数据库接近10GB)所以我想摆脱任何不必要的数据。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

自己解决这个问题的方法是使用EXPLAIN和查询(匹配)来查看实际使用的索引。如果您的查询不使用索引并且速度很慢,请创建索引(或手动告诉它使用index_hint),然后再次尝试EXPLAIN以查看是否使用了索引。

我希望如果允许您的用户只指定一个要搜索的列,并且该列不是第一列或索引列列表中的唯一列,则查询/匹配将使用非索引顺序搜索。换句话说,如果您的索引位于(headlinesubheadcontent),我希望索引可用于包含所有三列的任何搜索,或仅使用{{1 },或headlineheadline,但不仅仅是小标题,而不仅仅是内容。我有一段时间没有这样做,所以现在可能会有所不同;但是EXPLAIN应该揭示正在发生的事情。

如果使用EXPLAIN检查所有可能的查询并发现其中任何一个未使用索引,则不需要它。