una tipos simple que llave foranea clave campo php mysql sql group-by primary-key

php - tipos - que es una clave principal en access



¿GRUPO POR clave externa o clave principal? (5)

Acutally le sugiero que use el segundo porque hay una ligera diferencia de rendimiento entre un índice de clave principal y cualquier otro índice duplicado. Es muy probable que su consulta más común en esa tabla sea para descubrir si un usuario está en ciertas marcas, y esa consulta funcionará rápidamente a menos que marks.user_id pueda ser nulo.

Tengo dos mesas :

user ======= id name class marks ======= id user_id sub_id mark

la tabla de usuario contiene los detalles de la tabla de marcas de usuario (estudiante) contiene las calificaciones de un alumno en diferentes materias con id. de sujeto

Quiero obtener el nombre, la clase y las marcas totales de estas tablas.

Tengo dos consultas:

1. SELECT name, class, SUM(mark) AS total FROM user LEFT JOIN marks ON marks.user_id = user.id GROUP BY marks.user_id ///Here in GROUP BY I have used foreign key (marks.user_id) 2. SELECT name, class, SUM(mark) AS total FROM user LEFT JOIN marks ON marks.user_id = user.id GROUP BY user.id ///Here in GROUP BY I have used primary key (user.id)

Ambos me dan los datos requeridos. Mi pregunta es ¿cuál debo usar?

¿Hay alguna regla que diga que debe usar la clave principal en el grupo por O la clave foránea en el grupo por O algo así?


Cuando ejecuté el siguiente SQL:

DESCRIBE SELECT name, class, SUM(mark) AS total FROM user LEFT JOIN marks ON marks.user_id = user.id GROUP BY marks.user_id;

MySQL dijo que usa filesort para la tabla de usuario y que no se han usado claves para la tabla, y cuando ejecuté lo siguiente:

DESCRIBE SELECT name, class, SUM(mark) AS total FROM user LEFT JOIN marks ON marks.user_id = user.id GROUP BY user.id;

Ahora MySQL dice que usa claves para ambas tablas (en lugar de usar filesort). Por lo tanto, creo que el segundo debería ser la práctica recomendada ya que el filesort puede degradar el rendimiento.


Dado que ha realizado una combinación izquierda, debe usar la segunda consulta como marks.user_id podría ser nula.


Debe usar la agrupación de 2 versiones por la clave principal. En general, es mejor tener órdenes y agrupar por declaraciones basadas en columna (s) de la tabla principal y no en las juntas. Si ordena o agrupa en columnas de tabla unidas, MySQL tiene que crear tablas temporales que, en función de su tamaño de datos, puedan ir fácilmente al disco y terminar con un importante cuello de botella en el rendimiento.

Ejecutar estos explica para las dos consultas para ver lo que estaba hablando:

EXPLAIN SELECT name, SUM(mark) AS total FROM users LEFT JOIN marks ON marks.user_id = users.id GROUP BY marks.user_id; EXPLAIN SELECT name, SUM(mark) AS total FROM users LEFT JOIN marks ON marks.user_id = users.id GROUP BY users.id;

Lo mismo se puede encontrar aquí: http://sqlfiddle.com/#!2/a8ece/6


porque la clave principal es un índice único. grupo por (clave principal)

número de línea no reducido en su resultado

entonces creo que puedes usar group by (foreign key)