Mysql 在另一个全文索引上使用索引和匹配会出现错误“;Can';“找不到与列列表匹配的全文索引”;

Mysql 在另一个全文索引上使用索引和匹配会出现错误“;Can';“找不到与列列表匹配的全文索引”;,mysql,innodb,vbulletin,fulltext-index,Mysql,Innodb,Vbulletin,Fulltext Index,现在正在使用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(

现在正在使用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-找不到与列列表匹配的全文索引

删除
USE INDEX
可解决此问题

这肯定不会发生在全文索引的MyISAM实现上,因为这是vBulletin上的默认查询,并且在所有板上都可以正常运行

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

编辑:包括显示创建表格帖子

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

因为您强制mysql服务器
使用索引(threadid)
。服务器无法为您执行
匹配
。因为要执行全文搜索,服务器必须使用全文索引
title

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

更新我同意你的观点,这很奇怪:

如果表类型是MyISAM,即使您
使用索引(threadid)
,查询也可以工作,但在我看来,它似乎像是使用MyISAM的一些特性。当我使用
use INDEX
时,我必须非常确定我在做什么。因此,即使它适用于MyISAM,如果我喜欢的话,我也更愿意设置
使用索引(threadid,title)


请记住,以前版本的MySQL甚至5.5;-)的InnoDB也无法进行全文搜索

全文搜索不需要使用
使用索引
。Mysql知道您的
post.title、post.pagetext
设置了全文索引,如果列
thread.threadid
是索引,优化器将完成其工作。@AbhikChakraborty如前所述,这是vBulletin的默认查询,我无法更改它。啊,这是避免使用第三方软件包的另一个原因。向vBulletin投诉。同时,还可以执行
altertablepost-ENGINE=MyISAM@RickJames Customer出于性能原因使用InnoDB,将一个表更改回MyISAM是不可能的,因为它将破坏不同引擎中表之间的所有连接。不同引擎之间的连接有效。事务和外键不能与MyISAM一起使用——大部分被忽略。