2011-08-31 30 views
12

tengo la siguiente tabla en una base de datos MySQL:Columna Múltiple Índice vs Índices múltiples

CREATE TABLE `secondary_images` (
    `imgId` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `primaryId` int(10) unsigned DEFAULT NULL, 
    `view` varchar(255) DEFAULT NULL, 
    `imgURL` varchar(255) DEFAULT NULL, 
    `imgDate` datetime DEFAULT NULL, 
    PRIMARY KEY (`imgId`), 
    KEY `primaryId` (`primaryId`), 
    KEY `imgDate` (`imgDate`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

El SQL será el siguiente:

SELECT imgURL, view FROM secondary_images 
WHERE primaryId={$imgId} ORDER BY imgDate DESC 

Como se puede ver que hice tanto el primaryId y imgDate, claves de índice. Mi pensamiento detrás de eso fue porque la cláusula WHERE consulta los resultados usando el primaryId, y la cláusula ORDER usa imgDate.

Mi pregunta es, ¿sería mejor usar Índices múltiples como lo estoy ahora? ¿O debería un índice de columna múltiple (algo que no entiendo muy bien en este momento)?

Esto es lo que recibo de explicar:

id = 1 
select_type = simple  
table = secondary_images   
type = ref 
possible_keys = primaryId 
key = primaryId 
key_len = 5 
ref = const 
rows = 1 
extra = Using where; Using filesort 

NOTA: Esto no está utilizando una columna múltiple Índice, es el resultado del uso de la descripción de la tabla anterior.

+0

¿Puedes publicar el EXPLAIN para la selección? :) – Konerak

+2

Tenga en cuenta que los índices no son gratuitos. Si tiene varios indeces, eso significa que en cada inserción o actualización, cada índice debe actualizarse. Debe sopesar el rendimiento alcanzado por esas actualizaciones para la mejora del rendimiento que verá en la recuperación. – Marvo

+0

Recuerde también que si tiene una columna que tiene el mismo valor en muchas filas, los índices podrían empeorar el rendimiento. – Poodlehat

Respuesta

13

Debe usar un índice de varias columnas en (primaryId, imgDate) para que MySQL pueda usarlo para seleccionar las filas y la clasificación.

Si todas las columnas utilizadas para la clasificación no están en el índice utilizado para la selección, MySQL utiliza la estrategia "filesort", que consiste en clasificar todas las filas (en la memoria si no hay demasiadas filas, en el disco lo demás)

Si todas las columnas utilizadas para la clasificación están en el índice, MySQL usa el índice para obtener el orden de las filas (con algunas restricciones).

MySQL usa una estructura en árbol para los índices. Esto permite acceder a las claves directamente sin clasificación.

Un índice de varias columnas es básicamente un índice de la concatenación de las columnas. Esto le permite a MySQL encontrar la primera fila que coincida con primaryId={$imgId}, y luego acceder a todas las otras filas directamente en el orden correcto.

Con un índice de una sola fila en primaryId, MySQL puede encontrar todas las filas que coincidan con primaryId={$imgId}, pero encontrará las filas sin ningún orden en particular; entonces tendrá que ordenarlos después de eso.

Ver EXPLAIN y ORDER BY Optimization.

+0

No entiendo por qué: está comparando una columna con otra, no dos columnas simultáneamente con otras dos columnas. ¿Puedes explicar? – Poodlehat

+0

@ arnaud576875 - ¡Muchas gracias! ¿Alguna posibilidad de que me des una breve explicación de por qué es la mejor opción en esta situación? Además, ¿cómo voy a cambiar mi tabla actual usando 'SQL' para usar un índice de varias columnas en' (primaryId, imgDate) '? – stefmikhail

+0

@Poodlehat, stefmikhail He actualizado la respuesta – arnaud576875

11

Sus explicar el aspecto siguiente:

[id] => 1 
[select_type] => SIMPLE 
[table] => secondary_images 
[type] => ref 
[possible_keys] => primaryId 
[key] => primaryId 
[key_len] => 5 
[ref] => const 
[rows] => 1 
[Extra] => Using where; Using filesort 

Vamos a caminar a través de él.

[id] => 1 

Significa que estamos hablando de la primera tabla. Usted solo está llamando a una tabla en su estado de cuenta.

[select_type] => SIMPLE 

Estamos haciendo un simple SELECCIONAR.

[table] => secondary_images 

El nombre de la tabla en la pregunta.

[type] => ref 

El tipo de selección, más importante para las uniones.

[possible_keys] => primaryId 

Este es un campo importante : muestra las teclas que posiblemente puede ser utilizado para ayudar a la consulta en la ejecución más rápida. En este caso, solo tu clave principal se considera útil.

[key] => primaryId 

Este es un importante campo: muestra qué tecla (s) finalmente fueron utilizados. En este caso, la clave principal.

[key_len] => 5 
[ref] => const 
[rows] => 1 

Suponiendo el número de filas examinadas por la consulta.

[Extra] => Using where; Using filesort 

El más importante campo de en mi humilde opinión. - Uso de donde: Está utilizando una instrucción where. Bastante bien. - Usando filesort: el resultado de su consulta es tan grande, no puede ser ordenado en memoria. MySQL tiene que escribirlo en un archivo, ordenar el archivo y luego . Esto significa acceso al disco y ralentizará todo. Agregar un índice que puede ayudar a la clasificación a menudo ayuda, pero la resolución "using filesort" es un capítulo en sí mismo.

+0

Wow, wow wow. Muchas gracias por eso. Mucho más fácil de entender Entonces, ¿cómo puedo usar esta información para decidir si una clave de índice múltiple es el camino a seguir? No voy a pedirte que entres en el asunto del archivo porque tú mismo dijiste que ese era otro problema por completo, ¿pero cambiar a una clave de índice múltiple ayudaría con esto? – stefmikhail

+2

Debes ** ** leer primero sobre explicar. El sitio de MySQL es un gran lugar para comenzar, y 'High Performance MySQL' es el mejor libro de MySQL que he leído. Luego, entienda que depende mucho de su tabla, el motor de almacenamiento, su configuración (tamaños de caché y demás) y los datos en la tabla. Entonces, la mejor manera de probar: copie la tabla y agregue el índice deseado en la copia. Luego, compare las explicaciones. Esta es la razón por la cual debes entender explicar :) – Konerak

+0

Gracias de nuevo. Muy apreciado. Tomaré ese libro. – stefmikhail

Cuestiones relacionadas