6

现在在 vBulletin 板上工作,它在 MySQL 5.6.21 上运行,带有 InnoDB 表引擎。vBulletin 中有一个默认查询,它在一列上使用索引提示,同时在另外两列上使用全文索引。查询看起来像

SELECT postid, post.dateline FROM post AS post 
USE INDEX (threadid) 
INNER JOIN thread AS thread ON(thread.threadid = post.threadid) 
WHERE MATCH(post.title, post.pagetext) AGAINST ('+atlantic +blue +tang' IN BOOLEAN MODE) 
AND thread.threadid = 170467;

这给出了错误

#1191 - 找不到与列列表匹配的 FULLTEXT 索引

删除USE INDEX可以解决问题。

这肯定不会在 FULLTEXT 索引的 MyISAM 实现上发生,因为这是 vBulletin 上的默认查询,它在所有板上都运行良好。

这是否可能是 InnoDB 的一些配置,导致了这个问题?我们无法控制查询本身,因此寻找一种方法来解决服务器配置级别的问题。

编辑:包括 SHOW CREATE TABLE 帖子

CREATE TABLE `post` (
 `postid` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `threadid` int(10) unsigned NOT NULL DEFAULT '0',
 `parentid` int(10) unsigned NOT NULL DEFAULT '0',
 `username` varchar(100) NOT NULL DEFAULT '',
 `userid` int(10) unsigned NOT NULL DEFAULT '0',
 `title` varchar(250) NOT NULL DEFAULT '',
 `dateline` int(10) unsigned NOT NULL DEFAULT '0',
 `lastedit` int(10) unsigned NOT NULL DEFAULT '0',
 `pagetext` longtext NOT NULL,
 `allowsmilie` smallint(6) NOT NULL DEFAULT '0',
 `showsignature` smallint(6) NOT NULL DEFAULT '0',
 `ipaddress` varchar(15) NOT NULL DEFAULT '',
 `iconid` smallint(5) unsigned NOT NULL DEFAULT '0',
 `visible` smallint(6) NOT NULL DEFAULT '0',
 `attach` smallint(5) unsigned NOT NULL DEFAULT '0',
 `infraction` smallint(5) unsigned NOT NULL DEFAULT '0',
 `reportthreadid` int(10) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`postid`),
 KEY `userid` (`userid`),
 KEY `threadid` (`threadid`,`userid`),
 KEY `dateline` (`dateline`),
 FULLTEXT KEY `title` (`title`,`pagetext`)
) ENGINE=InnoDB AUTO_INCREMENT=1634030 DEFAULT CHARSET=utf8
4

1 回答 1

1

http://sqlfiddle.com/#!9/21fa5/3

由于您强制 mysql 服务器USE INDEX (threadid). 服务器不能MATCH为你做。因为要执行全文搜索服务器必须使用您的全文索引title

这就是为什么你应该USE INDEX (threadid)从查询中删除并允许 MySQL 服务器优化执行本身,或者添加title索引USE INDEX (threadid,title)

更新我同意你的看法,这很奇怪:http ://sqlfiddle.com/#!9/e363e/1

如果表类型是 MyISAM,即使您也可以查询,USE INDEX (threadid)但在我看来,这就像使用 MyISAM 的某些功能。当我使用时,USE INDEX我必须非常确定我在做什么。因此,即使它适用于 MyISAM,我也更愿意设置USE INDEX (threadid,title)是否是我喜欢的方式。

请记住,全文搜索不适用于 InnoDB 以前版本的 MySQL 甚至 5.5 ;-)

于 2015-09-11T14:49:53.787 回答