Eu não estou entendendo isso.
Eu tenho uma tabela com esses índices
PRIMARY post_id
INDEX topic_id
FULLTEXT post_text
A tabela possui (apenas) 346 000 linhas. Estou tentando realizar 2 consultas.
SELECT post_id
FROM phpbb_posts
WHERE topic_id = 144017
AND post_id != 155352
AND MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar')
leva 4,05 segundos enquanto
SELECT post_id
FROM phpbb_posts
WHERE topic_id=144017
AND post_id != 155352
AND post_text LIKE ('%http://rapidshare.com/files/5494794/photo.rar%')
leva 0,027 segundos.
EXPLAIN mostra que a única diferença está em possible_keys ( fulltext
inclui post_text, LIKE
não)
Isso é realmente estranho.
O que há por trás disso? O que está acontecendo em segundo plano? Como pode LIKE
ser tão rápido quando não está usando o índice e o FULLTEXT tão lento quando está usando o seu índice?
UPDATE1:
Na verdade, agora leva cerca de 0,5 segundos, talvez a tabela esteja bloqueada, mas ainda assim, quando ligo o perfil, é mostrado que a INICIALIZAÇÃO DO FULLTEXT levou 0,2 segundos. E aí?
Posso consultar minha tabela com LIKE
10x por segundo, com texto completo apenas 2x
UPDATE2:
Surpresa!
mysql> SELECT post_id FROM phpbb_posts WHERE post_id != 2 AND topic_id = 6 AND MATCH(post_text) AGAINST ('rapidshare.com');
Empty set (0.04 sec)
então eu estou perguntando, como isso é possível?
Além disso,
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com')
é muito lento. O texto completo pode estar quebrado?
UPDATE3:
Que diabos?
SELECT forum_id, post_id, topic_id, post_text FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
leva 0,27s enquanto
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
leva mais de 30 segundos! o que há de errado aqui?
fonte
Respostas:
Eu acho que o problema pode resultar da presença do próprio índice FULLTEXT.
Sempre que há uma consulta envolvendo um índice FULLTEXT, o MySQL Query Optimizer tende a atacar a consulta em uma verificação completa da tabela. Eu tenho visto isso ao longo dos anos. Também escrevi um post anterior sobre esse comportamento mais insignificante nos índices do FULLTEXT .
Você pode precisar fazer duas coisas:
REFator A Consulta
Aqui está sua consulta original
Você precisará refatorar a consulta assim:
CRIAR UM NOVO ÍNDICE
Você precisará de um índice para dar suporte
subqueryA
. Você já tem um índice ativadotopic_id
. Você precisa substituí-lo da seguinte maneira:De uma chance !!!
UPDATE 2012-03-19 13:08 EDT
Experimente este primeiro
Se isso for rápido e retornar um pequeno número de linhas, tente esta subconsulta aninhada:
UPDATE 2012-03-19 13:11 EDT
Compare o tempo de execução disso:
com isso
Se o tempo de execução for o mesmo, a cláusula MATCH será executada em todas as linhas. Como mencionei anteriormente, o uso de índices FULLTEXT tende a anular quaisquer benefícios tentados e contribuídos pelo MySQL Query Optimizer.
fonte
post_id
confunde? Por que a consulta LIKE funciona mesmo sem ter índice nessas colunas (topic_id, post_id)? Por que o MYSQL não seleciona apenas inteligentementetopic_id = 144017 AND post_id != 155352
e depois apenas navega por esses resultados? E se 100k linhas incluírem minha string de pesquisa de texto completopost_text
? Não selecionaria todos eles?