2015-04-17 5 views
6

Работает на vBulletin, которая работает на MySQL 5.6.21 с движком таблицы InnoDB. В vBulletin есть запрос по умолчанию, который использует подсказку индекса в одном столбце и одно и то же время использует полнотекстовый индекс в двух других столбцах. Запрос выглядитИСПОЛЬЗОВАНИЕ INDEX и MATCH на другом индексе FULLTEXT дает ошибку «Не удается найти индекс FULLTEXT, соответствующий столбцу»

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 решает проблему.

Этого не происходило при реализации индекса FULLTEXT в MyISAM, так как это запрос по умолчанию в vBulletin, и он отлично работает на всех платах.

Возможно ли это какая-то конфигурация для InnoDB, которая вызывает эту проблему? У нас нет контроля над самим запросом, поэтому мы ищем способ решить проблему на уровне конфигурации сервера.

EDIT: включена 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 
+0

Вам не нужно использовать 'использовать index' для полнотекстового поиска. Mysql знает, что ваш 'post.title, post.pagetext' настроен с полным текстовым индексом и более, если столбец' thread.threadid' является индексом, оптимизатор выполнит свою работу. –

+1

@AbhikChakraborty Как уже упоминалось, это запрос по умолчанию из vBulletin, и я не могу его изменить. –

+0

Ах, еще одна причина избегать пакетов сторонних производителей. Пожаловаться на vBulletin. Тем временем, _might_ работает над выполнением 'ALTER TABLE post ENGINE = MyISAM;' –

ответ

1

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

Поскольку вы заставили сервер MySQL в USE INDEX (threadid). Сервер не может сделать MATCH для вас. Поскольку для выполнения полнотекстового поиска сервер должен использовать ваш полнотекстовый индекс title.

Вот почему вы должны удалить USE INDEX (threadid) из запроса и позволить серверу MySQL оптимизировать сам выполнение, или добавить title индекс как USE INDEX (threadid,title)

UPDATE Я согласен с вами, что это странно: http://sqlfiddle.com/#!9/e363e/1

Если тип таблицы - это запрос MyISAM, даже если вы USE INDEX (threadid), но мне кажется, что это какая-то особенность использования MyISAM. Когда я использую USE INDEX, я должен быть очень уверен, что я делаю. Поэтому, даже если это работает для MyISAM, я бы предпочел установить USE INDEX (threadid,title), если это так, как я предпочитаю.

И имейте в виду, что полнотекстового поиска не работает в InnoDB для prvious версий MySQL даже 5,5 ;-)

 Смежные вопросы

  • Нет связанных вопросов^_^