2012-09-02 14 views
5

Tengo la siguiente tabla (file_category_tbl) para representar las conexiones entre los archivos y las categorías.¿Cómo indexar correctamente lo siguiente?

fileId - bigint(20)   
categoryId - bigint(20) 
order - int(10) 

Para que los archivos de una categoría se pueden pedir, tengo un campo de orden ... Por tanto, mi pregunta es ¿qué índices iba a requerir para un rendimiento óptimo en lo siguiente:

SELECT * FROM file_category_tbl WHERE categoryId="3" ORDER BY order ASC 

Tengo un índice único UNICO (fileId, categoryId); Como no puede haber el mismo fileId con el mismo categoryId. También tengo un índice en categoryId, ya que esto es lo que se está buscando. También tengo un índice en order? ... pero ¿es esto necesario? ya que sólo está haciendo un orderBy en este ...

Saludos cordiales a cualquier respondedor ... J

+0

Creo que un índice de varias de 'categoryId, order' debería ser suficiente para la consulta anterior – Ankur

+0

pensé que MySQL no se preocupaba por los índices en la parte' ORDEN BY'. EDITAR: Si mysql puede o no puede usar índices en el 'ORDER BY' depende de mucho: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – Krycke

Respuesta

1

Según mi entendimiento, su indexación es sensible y ayudará al rendimiento de la consulta. Pero también le sugeriría a tener un índice Primary Key en la tabla en lugar de sólo tener el combinado Unique Index

La razón por la que digo esto es, si usted quiere hacer referencia a cualquiera de sus registros de esta tabla, puede ser para eliminarlo o hacer cualquier otra función, una clave principal sería útil. Por otro lado, podría rebajar el rendimiento de su consulta porque necesita todos los campos y ahora con el campo de clave principal, debe ingresar 4 campos. Como solución para eso, puede especificar qué columnas quiere en su resultado.

la esperanza que esto tiene sentido :-)

2

Como se documenta bajo ORDER BY Optimization:

En algunos casos, MySQL no puede índices de uso para resolver el ORDER BY, aunque todavía utiliza los índices para encontrar las filas que coinciden con la cláusula WHERE. Estos casos incluyen los siguientes:

[ deletia ]

  • La clave utilizada para traer las filas no es la misma que la utilizada en el ORDER BY:

    SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

Por lo tanto, su indexación actual no se puede usar para realizar el tipo de operación norte.Sin embargo, la misma página también documentos:

El índice también se puede utilizar incluso si el ORDER BY no coincide con el índice de exactitud, siempre y cuando todas las partes no utilizadas del índice y todo el extra ORDER BY columnas son constantes en la cláusula WHERE. Las siguientes consultas utilizar el índice para resolver el ORDER BY parte:

[ deletia ]

SELECT * FROM t1 
    WHERE key_part1=constant 
    ORDER BY key_part2;

Por lo tanto un índice compuesto sobre (categoryId,order) se puede utilizar para tanto el filtro y las operaciones de ordenación, que es el resultado óptimo para esta consulta.

Cuestiones relacionadas