2010-12-08 10 views
5

Tengo dos clases, Foo y Bar. Cada Bar contendrá muchos Foo s. Foo s pueden estar en múltiples Bar s, pero cada Foo solo puede estar en un determinado Bar una vez. Tengo la siguiente estructura de tabla:¿Una clave principal de MySQL en dos columnas ayuda con las consultas en la segunda columna?

CREATE TABLE `bar_foos` (
    `bar_id` INT UNSIGNED NOT NULL, 
    `foo_id` INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`bar_id` , `foo_id`) 
); 

Esto debería funcionar bien para mi relación muchos a muchos. Mi pregunta es si deseo que mi código pueda verificar si un Foo está siendo usado por cualquier Bar s, I.E. para indicar al usuario "Este Foo no se puede eliminar porque está en uso por 5 Bars", ¿el Índice principal CLAVE me ayude con una consulta como

SELECT * FROM `bar_foos` WHERE `foo_id`=2 

o

SELECT COUNT(*) FROM `bar_foos` WHERE `foo_id`=2 

O, ¿verdad necesita un índice separado para la columna foo_id solo?

+0

Si se trata de una relación de uno a muchos, ¿por qué necesita una tabla 'bar_foos'? ¿Por qué no simplemente usar 'bar.foo_id' (y tener un índice en ese campo también)? –

+1

"Los foos pueden estar en múltiples barras pero cada Foo solo puede estar en una barra determinada una vez". No es una relación de uno a muchos, es de muchos a muchos con distintas combinaciones. –

+0

@Michael: @djacobson se metió en la nariz, no puedo hacerlo de esa manera – Josh

Respuesta

6

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

"Si la tabla tiene un índice de múltiples columnas, cualquier prefijo más a la izquierda del índice puede ser utilizado por el optimizador para encontrar filas. Por ejemplo, si usted tiene un índice de tres columnas en (col1 , col2, col3), tiene funciones de búsqueda indexadas en (col1), (col1, col2) y (col1, col2, col3).

MySQL no puede usar un índice si las columnas no forman un prefijo de la izquierda El índice."

+2

Entonces, ¿necesita revertir su estrategia de índice? – jcolebrand

+0

Para esa consulta en particular, necesitaría otro índice con foo_id como la única columna o la más a la izquierda –

1

No. Ayuda en el primero o en ambos.

+0

Incluso si es PRIMARIO? – Josh

+3

PRIMARY es solo un índice único. La única razón por la que tiene un nombre especial es porque algunos motores de almacenamiento (por ejemplo, InnoDB) ordenan los datos en el disco por uno de los índices. –

2

En una palabra, No.

En una búsqueda clave parcial, sólo sería útil que los parciales están en el orden en que están en el índice. Entonces, si la clave fuera una clave de tres partes y usted buscara en las partes 1 & 2, pero no en 3, sería útil. Si buscó en las partes 2 & 3, no lo haría.

3

Imagina si estuvieras buscando en una guía telefónica donde hay un índice de apellidos con un índice secundario en el primer nombre. (Y esto es realmente lo que es.)

  • buena - donde apellidos = 'Smith' y nombre apellido = 'John'
  • buena - donde apellidos = 'Smith'
  • mal - donde nombre apellido = ' John '

' John's puede aparecer en cualquier página de la guía telefónica, por lo que no lo limita.

Por lo tanto, si quiere usar el índice en los nombres, debería 'imprimir una nueva guía telefónica que ordena los nombres por el primer nombre. O bien, en una base de datos, cree un nuevo índice con nombres como el primer índice de columna.

Cuestiones relacionadas