2015-04-17 14 views
6

Arbeiten jetzt auf einem vBulletin-Board, das auf MySQL 5.6.21 mit InnoDB-Tabellen-Engine ausgeführt wird. Es gibt eine Standardabfrage in vBulletin, die den Indexhinweis für eine Spalte verwendet und gleichzeitig den Volltextindex für zwei weitere Spalten verwendet. Die Abfrage sieht aus wieUSE INDEX und MATCH auf einem anderen FULLTEXT-Index gibt den Fehler "Kann FULLTEXT-Index nicht finden, die die Spaltenliste entspricht"

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; 

Dieser Fehler

# 1191 gibt - Kann nicht FULLTEXT- Sions die Spaltenliste

Entfernen USE INDEX löst das Problem finden.

Dies geschah nicht auf MyISAM Implementierung von FULLTEXT Index sicher, da dies die Standardabfrage auf vBulletin ist und es läuft auf allen Boards.

Ist es möglich, dass dies eine Konfiguration für InnoDB ist, die dieses Problem verursacht? Wir haben keine Kontrolle über die Abfrage selbst und suchen nach einer Möglichkeit, das Problem auf der Serverkonfigurationsebene zu lösen.

EDIT: Eingeschlossen SHOW CREATE TABLE Post

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

Sie brauchen nicht 'zu verwenden zu verwenden index' für Volltextsuche. Mysql weiß, dass Ihr 'post.title, post.pagetext' mit einem Volltextindex und mehr eingerichtet wird, wenn die Spalte' thread.threadid' index ist, der Optimizer wird seine Aufgabe erfüllen. –

+1

@AbhikChakraborty Wie bereits erwähnt, ist diese Standardabfrage von vBulletin, und ich kann es nicht ändern. –

+0

Ah, ein weiterer Grund, Pakete von Drittanbietern zu meiden. Beschweren Sie sich bei vBulletin. Inzwischen _might_ es einiges zu tun 'TABLE Post ENGINE = MyISAM ALTE;' –

Antwort

1

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

Da Sie MySQL-Server zu USE INDEX (threadid) gezwungen. Server kann MATCH nicht für Sie tun. Um den Volltextsuchserver auszuführen, muss der Volltextindex title verwendet werden.

Deshalb sollten Sie USE INDEX (threadid) von Abfrage entfernen sollten und erlauben MySQL-Server die Ausführung selbst, oder fügen Sie title Index wie USE INDEX (threadid,title)

UPDATE Ich stimme Ihnen zu optimieren, das ist seltsam: http://sqlfiddle.com/#!9/e363e/1

Wenn der Tabellentyp MyISAM ist, funktioniert die Abfrage auch dann, wenn Sie USE INDEX (threadid) haben, aber es scheint mir wie eine Funktion von MyISAM zu sein. Wenn ich USE INDEX verwende, muss ich sehr sicher sein, was ich tue. Auch wenn es für MyISAM funktioniert, würde ich lieber USE INDEX (threadid,title) einstellen, wenn es das ist, was ich bevorzuge.

Und bedenken Sie, dass die Volltextsuche nicht für prvious Versionen von MySQL für InnoDB funktionierte sogar 5,5 ;-)