sql >> Base de Datos >  >> RDS >> Mysql

Corregir la indexación al usar el operador OR

No entiendes cómo funcionan los índices.

Piense en una guía telefónica (el equivalente a un índice de dos columnas con el apellido primero y el nombre al final). Si le pido que encuentre a todas las personas en la guía telefónica cuyo apellido es "Smith", puede beneficiarse del hecho de que los nombres están ordenados de esa manera; puede suponer que los Smith están organizados juntos. Pero si le pido que encuentre a todas las personas cuyo primer nombre es "John", no obtiene ningún beneficio del índice. Johns puede tener cualquier apellido, por lo que están dispersos a lo largo del libro y terminas teniendo que buscar de la manera más difícil, de principio a fin.

Ahora, si te pido que encuentres a todas las personas cuyo apellido es "Smith" O cuyo primer nombre es "John", puedes encontrar a los Smith fácilmente como antes, pero eso no te ayuda en absoluto a encontrar a los John. Todavía están dispersos por todo el libro y tienes que buscarlos por las malas.

Es lo mismo con los índices de varias columnas en SQL. El índice se ordena por la primera columna, luego se ordena por la segunda columna en caso de empate en la primera columna, luego se ordena por la tercera columna en caso de empate en las dos primeras columnas, etc. No se ordena por todas las columnas simultaneamente. Por lo tanto, su índice de varias columnas no ayuda a que sus términos de búsqueda sean más eficientes, a excepción de la columna que se encuentra más a la izquierda en el índice.

Vuelve a tu pregunta original.

Cree un índice separado de una sola columna en cada columna. Uno de estos índices será una mejor opción que los demás, según el estimación de cuántas operaciones de E/S el índice incurrirá si se utiliza.

Las versiones modernas de MySQL también tienen algunos conocimientos sobre fusión de índices , por lo que la consulta puede use más de un índice en una tabla determinada y luego intente fusionar los resultados. De lo contrario, MySQL tiende a limitarse a usar un índice por tabla en una consulta determinada.

Otro truco que mucha gente usa con éxito es hacer una consulta separada para cada una de sus columnas indexadas (que deberían usar el índice respectivo) y luego UNION los resultados.

SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 

Una observación final:si te encuentras buscando el mismo 'something' en cuatro campos, debe reconsiderar si los cuatro campos son realmente lo mismo y es culpable de diseñar una tabla que viola la primera forma normal con grupos repetidos . Si es así, quizás el campo 1 al campo 4 pertenezcan a una sola columna en una tabla secundaria. Entonces se vuelve mucho más fácil indexar y consultar:

SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'