2015-04-17 12 views
6

Lavorando ora su una scheda vBulletin, che gira su MySQL 5.6.21 con il motore di tabella InnoDB. Esiste una query predefinita in vBulletin, che utilizza l'hint dell'indice su una colonna e allo stesso tempo utilizza l'indice fulltext su altre due colonne. La query sembraUSE INDICE e MATCH su un altro indice FULLTEXT restituisce l'errore "Impossibile trovare l'indice FULLTEXT corrispondente all'elenco di colonne"

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; 

Questo dà errore

# 1191 - Impossibile trovare indice FULLTEXT corrispondenza l'elenco delle colonne

Rimozione USE INDEX risolve il problema.

Questo non stava accadendo sull'implementazione MyISAM dell'indice FULLTEXT di sicuro, poiché questa è la query predefinita su vBulletin e funziona bene su tutte le schede.

È possibile che questa configurazione per InnoDB causi questo problema? Non abbiamo il controllo sulla query stessa, quindi cerchiamo un modo per risolvere il problema a livello di configurazione del server.

EDIT: SHOW Incluso CREATE TABLE postale

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

Non è necessario usare 'utilizzare index' per ricerca a testo integrale. Mysql sa che il tuo 'post.title, post.pagetext' sono impostati con indice di testo completo e altro se la colonna' thread.threadid' è index, optimizer farà il suo lavoro. –

+1

@AbhikChakraborty Come accennato, questa è una query predefinita da vBulletin e non posso cambiarla. –

+0

Ah, un altro motivo per evitare pacchetti di terze parti. Reclami con vBulletin. Nel frattempo, _might_ lavoro da fare 'ALTER TABLE post ENGINE = MyISAM;' –

risposta

1

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

Dal momento che ti ha costretto a server MySQL USE INDEX (threadid). Il server non può fare MATCH per te. Perché per eseguire il server di ricerca fulltext è necessario utilizzare l'indice di testo completo title.

Ecco perché è necessario rimuovere USE INDEX (threadid) da query e consentire server MySQL per ottimizzare l'esecuzione in sé, o aggiungere title indice come USE INDEX (threadid,title)

UPDATE Sono d'accordo con voi, che è strano: http://sqlfiddle.com/#!9/e363e/1

Se il tipo di tabella è la query MyISAM funziona anche se si è USE INDEX (threadid) ma mi sembra che alcune funzioni dell'utilizzo di MyISAM. Quando uso USE INDEX devo essere molto sicuro di quello che sto facendo. Quindi, anche se funziona per MyISAM, preferirei impostare USE INDEX (threadid,title) se è quello che preferisco.

e tenere a mente che la ricerca full-text non ha funzionato per InnoDB per le versioni di MySQL prvious anche 5.5 ;-)

Problemi correlati