¿Está bien indexar todos los campos en esta consulta de mysql?

Tengo esta consulta de mysql y no estoy seguro de cuáles son las implicaciones de indexar todos los campos de la consulta. Quiero decir, ¿está bien indexar todos los campos en la declaración CASE, la declaración de unión y la declaración Where? ¿Existe alguna implicación en el rendimiento de los campos de indexación?

SELECT roots.id as root_id, root_words.*,
CASE 
WHEN root_words.title LIKE '%text%' THEN 1
WHEN root_words.unsigned_title LIKE '%normalised_text%' THEN 2
WHEN unsigned_source LIKE '%normalised_text%' THEN 3
WHEN roots.root LIKE '%text%' THEN 4
END as priorities
FROM  roots INNER JOIN root_words ON roots.id=root_words.root_id
WHERE (root_words.unsigned_title LIKE '%normalised_text%') OR (root_words.title LIKE '%text%')
OR (unsigned_source LIKE '%normalised_text."%') OR (roots.root LIKE '%text%') ORDER by priorities

Además, ¿cómo puedo mejorar aún más la velocidad de la consulta anterior?

¡Gracias!

preguntado el 08 de noviembre de 11 a las 18:11

4 Respuestas

  1. Indiza columnas en tablas, no consultas.

  2. Ninguno de los criterios de búsqueda que ha especificado podrá utilizar índices (ya que los términos de búsqueda comienzan con un comodín).

  3. Debe asegurarse de que el id columna está indexada, para acelerar la JOIN. (Presumiblemente, ya está indexado como CLAVE PRIMARIA en una tabla y CLAVE EXTRANJERA en la otra).

Para acelerar esta consulta, deberá utilizar la búsqueda de texto completo. Agregar índices no se acelerará esta consulta en particular y le costará tiempo en INSERTAR, ACTUALIZAR y ELIMINAR.

respondido 08 nov., 11:22

Advertencia: los índices aceleran el tiempo de recuperación, pero hacen que las inserciones y las actualizaciones se ejecuten más lentamente.

respondido 08 nov., 11:22

Para responder a las implicaciones de indexar cada campo, hay un impacto en el rendimiento cuando se utilizan índices cada vez que se modifican los datos que se indexan, ya sea mediante inserciones, actualizaciones o eliminaciones. Esto se debe a que SQL necesita mantener el índice. Es un equilibrio entre la frecuencia con la que se leen los datos y la frecuencia con la que se modifican.

En esta consulta específica, el único índice que posiblemente podría ayudar sería en su JOIN cláusula, en los campos roots.id y root_words.root_id.

Ninguno de los cheques en su WHERE la cláusula podría indexarse, debido a la '%'. Esto hace que SQL escanee cada fila de estas tablas en busca de un valor coincidente.

Si puede eliminar el líder '%', entonces se beneficiaría de los índices en estos campos ... si no, debería considerar implementar búsqueda de texto completo; pero tenga cuidado, esto no es trivial.

respondido 08 nov., 11:22

La indexación no ayudará cuando se use junto con LIKE '%something%'.

Es como buscar palabras en un diccionario que tengan ae en ellos en alguna parte. El diccionario (o Índice en este caso) se organiza en base a la primera letra de la palabra, luego la segunda letra, etc. No tiene ningún mecanismo para poner todas las palabras con ae en ellos muy juntos. Aún terminas leyendo el diccionario completo de principio a fin.


La indexación de los campos utilizados en la cláusula CASE probablemente no le ayudará. La indexación ayuda al facilitar la búsqueda de registros en una tabla. La cláusula CASE trata sobre procesar los registros que ha encontrado, no encontrarlos en primer lugar.


Los optimizadores también pueden tener dificultades para optimizar varios OR condiciones como la tuya. El optimizador está tratando de reducir la cantidad de esfuerzo para completar su consulta, pero eso es difícil de hacer cuando condiciones no relacionadas pueden hacer que un registro sea aceptable.


En general, su consulta se beneficiaría de los índices en roots(root_id) y/o roots(id), pero no mucho más.

Sin embargo, si tuviera que indexar campos adicionales, los dos costos principales son:
- Mayor tiempo de escritura (insertar, actualizar o eliminar) debido a índices adicionales para escribir
- Mayor espacio ocupado en el disco

respondido 08 nov., 11:22

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.