mysql - 在另一个 FULLTEXT 索引上使用 INDEX 和 MATCH 给出错误 "Can' t 找到与列列表匹配的 FULLTEXT 索引”

标签 mysql innodb vbulletin fulltext-index

现在在 vBulletin board 上工作,它运行在带有 InnoDB 表引擎的 MySQL 5.6.21 上。 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 - Can't find FULLTEXT index matching the column list

删除 USE INDEX 可解决问题。

这肯定不会发生在全文索引的 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

最佳答案

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)

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

关于mysql - 在另一个 FULLTEXT 索引上使用 INDEX 和 MATCH 给出错误 "Can' t 找到与列列表匹配的 FULLTEXT 索引”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29692510/

相关文章:

mysql - 使用mysql从组中选择随机行

mysql - 使用 sequelize.js 在 2 个表之间嵌套 mysql 事务

mysql - 我们如何在 zend 框架中使用 IN() 编写查询?

mysql - 如果移动 ibdata1 文件,为什么 mysql 不会重新启动/受到影响?

mysql - 优化 MySQL 中的哈希搜索

mysql - 搜索并替换多条记录中的部分字段

ruby-on-rails - Vbulletin 和 rails 应用程序之间的单点登录

mysql - Redmine svn 存储库 - 无法从远程进行身份验证

php - 在vBulletin中使用curl登录网站

mysql - mysql中如何避免死锁