No entiendo esto.
Tengo una tabla con estos índices.
PRIMARY post_id
INDEX topic_id
FULLTEXT post_text
La tabla tiene (solo) 346 000 filas. Estoy tratando de 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')
toma 4.05 segundos mientras
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%')
toma 0.027 segundos.
EXPLAIN muestra que la única diferencia está en fulltext
posible_keys ( tiene post_text incluido, LIKE
no)
Eso es realmente extraño
¿Qué hay detrás de esto? ¿Qué está pasando en el fondo? ¿Cómo puede LIKE
ser tan rápido cuando no se usa el índice y FULLTEXT tan lento cuando se usa su índice?
ACTUALIZACIÓN1:
En realidad, ahora toma alrededor de 0,5 segundos, tal vez la mesa estaba bloqueada, pero aún así, cuando enciendo el perfil, se muestra que la INICIALIZACIÓN DE FULLTEXT tardó 0.2 segundos. ¿Qué pasa?
Puedo consultar mi tabla con LIKE
10x por segundo, con texto completo solo 2x
ACTUALIZACIÓN2:
¡Sorpresa!
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)
así que pregunto, ¿cómo es esto posible?
Adicionalmente,
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com')
es realmente lento ¿Se puede romper el texto completo?
ACTUALIZACIÓN3:
¿Que demonios?
SELECT forum_id, post_id, topic_id, post_text FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
toma 0.27s mientras
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
¡Lleva más de 30 segundos! ¿Qué está pasando mal aquí?
fuente
Respuestas:
Creo que el problema puede deberse a la presencia del índice FULLTEXT en sí.
Cada vez que hay una consulta que involucra un índice FULLTEXT, MySQL Query Optimizer tiende a incluir la consulta en un escaneo completo de la tabla. He visto esto a lo largo de los años. También escribí una publicación anterior sobre este comportamiento más insignificante en los índices FULLTEXT .
Es posible que deba hacer dos cosas:
REFACTOR LA CONSULTA
Aquí está tu consulta original
Deberá refactorizar la consulta de esta manera:
CREAR UN NUEVO ÍNDICE
Necesitará un índice para soportar
subqueryA
. Ya tienes un índice entopic_id
. Debe reemplazarlo de la siguiente manera:Darle una oportunidad !!!
ACTUALIZACIÓN 2012-03-19 13:08 EDT
Prueba este primero
Si esto se ejecuta rápidamente y devuelve un pequeño número de filas, intente con esta subconsulta anidada:
ACTUALIZACIÓN 2012-03-19 13:11 EDT
Compare el tiempo de ejecución de esto:
con este
Si el tiempo de ejecución es el mismo, entonces la cláusula MATCH se está ejecutando en cada fila. Como mencioné anteriormente, el uso de índices FULLTEXT tiende a anular cualquier beneficio que intente y contribuya MySQL Query Optimizer.
fuente
post_id
confunde? ¿Por qué la consulta LIKE funciona incluso sin tener índice en estas columnas (topic_id, post_id)? ¿Por qué MYSQL no solo selecciona de forma inteligentetopic_id = 144017 AND post_id != 155352
y luego solo navega a través de estos resultados? ¿Y qué pasa si 100k filas incluyen mi cadena de búsqueda de texto completopost_text
? ¿No los seleccionaría a todos?