0

我继承了使用 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),所以我想删除任何不必要的数据。

提前谢谢了。

4

1 回答 1

0

自己弄清楚的方法是将 EXPLAIN 与查询(匹配)一起使用,以查看实际使用了哪些索引。如果您的查询不使用索引并且速度很慢,请创建索引(或手动告诉它使用 index_hint),然后再次尝试 EXPLAIN 以查看索引是否被使用。

我希望如果您的用户只允许指定要搜索的一列,并且该列不是索引列列表中的第一列或唯一列,则查询/匹配将使用非索引顺序搜索。换句话说,如果您的索引位于 ( headline, subhead, content) 上,我希望该索引可用于所有三列的任何搜索,或者仅使用headline, 或使用headlineand subhead,但不仅仅用于副标题,也不仅仅是用于内容。我有一段时间没有这样做了,所以现在可能会有所不同;但 EXPLAIN 应该揭示发生了什么。

如果您使用 EXPLAIN 检查所有可能的查询并发现其中任何一个都没有使用索引,那么您就不需要它。

于 2013-05-25T15:35:15.753 回答