Estoy escribiendo un script que genera un informe basado en una consulta que usa varias tablas unidas. Una de las entradas al script será una lista de los campos que se requieren en el informe. Dependiendo de los campos solicitados, algunas de las tablas pueden no ser necesarias. Mi pregunta es: ¿hay una penalización de rendimiento [significativa] por incluir una unión cuando no se hace referencia a ella en una cláusula SELECT o WHERE?Penalizaciones de rendimiento para uniones no utilizadas
considerar las siguientes tablas:
mysql> SELECT * FROM `Books`;
+----------------------+----------+
| title | authorId |
+----------------------+----------+
| Animal Farm | 3 |
| Brave New World | 2 |
| Fahrenheit 451 | 1 |
| Nineteen Eighty-Four | 3 |
+----------------------+----------+
mysql> SELECT * FROM `Authors`;
+----+----------+-----------+
| id | lastName | firstName |
+----+----------+-----------+
| 1 | Bradbury | Ray |
| 2 | Huxley | Aldous |
| 3 | Orwell | George |
+----+----------+-----------+
lo hace
SELECT
`Authors`.`lastName`
FROM
`Authors`
WHERE
`Authors`.`id` = 1
Sobreponderar.-
SELECT
`Authors`.`lastName`
FROM
`Authors`
JOIN
`Books`
ON `Authors`.`id` = `Books`.`authorId`
WHERE
`Authors`.`id` = 1
?
Me parece que MySQL debería saber ignorar por completo el JOIN, ya que la tabla no está referenciada en la cláusula SELECT o WHERE. Pero de alguna manera dudo que este sea el caso. Por supuesto, este es un ejemplo realmente básico. Los datos reales involucrados serán mucho más complejos.
Y realmente, no es una oferta terriblemente grande ... Solo necesito saber si mi script debe ser "inteligente" sobre las uniones, y solo incluirlas si los campos solicitados se basarán en ellas.
Los casos que ha enumerado realmente pueden arrojar resultados diferentes. Cuando se une a las tablas, los resultados devueltos no serán todos los autores, serán todos los autores que hayan escrito un libro. –
Oh, buen punto ... ¿Qué pasa si se trata de una combinación de izquierda? Entonces es completamente innecesario y devuelve los mismos resultados. En ese caso, me pregunto si habría un beneficio en el rendimiento al excluir la unión. –
Oh, pero incluso con una combinación de la izquierda, habría un potencial de duplicados (en este caso, si la cláusula WHERE era: 'Authors''id' = 3). Por lo tanto, MySQL siempre tendrá que ver primero lo que hay en esa tabla ... Por lo tanto, siempre habrá una disminución en el rendimiento. Lo tengo. ¡Gracias! –