No entiendes cómo funcionan los índices.
Piense en una guía telefónica (el equivalente de un índice de dos columnas en el apellido primero, el nombre es el último). Si le pido que busque 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 busque a todas las personas cuyo nombre de pila es "John", no obtiene ningún beneficio del índice. Johns puede tener cualquier apellido, por lo que están dispersos en todo el libro y terminas teniendo que buscar por el camino difícil, de principio a fin.
Ahora, si le pido que busque a todas las personas cuyo apellido es "Smith" O cuyo nombre es "John", puede encontrar los Smiths fácilmente como antes, pero eso no ayuda en absoluto a encontrar el Johns. Todavía están dispersos en todo el libro y tienes que buscarlos de la manera difícil.
Lo mismo ocurre con los índices de varias columnas en SQL. El índice está ordenado por la primera columna, luego ordenado por la segunda columna en casos de vínculos en la primera columna, luego ordenado por la tercera columna en casos de vínculos en las dos primeras columnas, etc. No está ordenado 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 de la izquierda en el índice.
Volver a su pregunta original.
¿Cuál sería la forma correcta de indexar dicha tabla para esta consulta?
Cree un índice de una columna por separado en cada columna. Uno de estos índices será una mejor opción que los demás, según el estimation of how many I/O operations de MySQL en el que incurrirá el índice si se utiliza.
Las versiones modernas de MySQL también tienen algunas inteligencia sobre index merging, por lo que la consulta puede utilizar más de un índice en una tabla dada, y luego tratar de combinar 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 por separado para cada una de sus columnas indexadas (que deben 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 usted se encuentra en busca de los mismos 'something'
a través de cuatro campos, se debe reconsiderar si los cuatro campos son realmente la misma cosa, y usted es culpable de diseñar una tabla que violates First Normal form with repeating groups. Si es así, tal vez campo1 a campo4 pertenecen a una sola columna en una tabla secundaria.A continuación, se hace mucho más fácil de índice y consulta:
SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'