2011-05-02 17 views
7

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.

+0

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. –

+0

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. –

+0

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! –

Respuesta

3

Esto no está en uso, ya que significa que solo los Autores que existen en Libros están incluidos en el conjunto de resultados.

JOIN 
    `Books` 
    ON `Authors`.`id` = `Books`.`authorId` 

Sin embargo, si "sabía" que cada autor existía en el libro que habría algún beneficio en el rendimiento en la eliminación de la unión pero dependería en gran medida idexes y el número de registros de la tabla y la lógica en el join (especialmente cuando se realizan conversiones de datos)

1

Las uniones siempre llevarán tiempo.

efectos secundarios
Además de eso inner join (que es el valor por defecto unirse a) influye en el resultado, al limitar el número de filas que se obtienen. Por lo tanto, dependiendo de si todos authors están en books, las dos consultas pueden ser idénticas o no.

También si un author ha escrito más de un book el resultado de la consulta 'unida' mostrará resultados duplicados.

Rendimiento
En la cláusula WHERE que han declarado authors.id a ser una constante =1, por lo tanto, (siempre que tenga índices en author.id y books.author_id) será una búsqueda muy rápida para ambas tablas. El tiempo de consulta entre las dos tablas será muy cercano.

En general, las uniones pueden tomar bastante tiempo y con todos los efectos secundarios adicionales solo deben llevarse a cabo si realmente desea utilizar la información adicional que ofrece la unión.

1

Este es el tipo de pregunta que es imposible de responder.Sí, agregar la unión tomará tiempo adicional; es imposible saber si podrá medir ese tiempo sin, bueno, medir el tiempo.

En términos generales, si, como en su ejemplo, se está uniendo a claves principales, con índices únicos, es poco probable que se haga una diferencia apreciable.

Si tiene combinaciones más complejas (que insinúa), o se unen en campos sin un índice, o si su unión implica una función, la penalización del rendimiento puede ser significativa.

Por supuesto, aún puede ser más fácil hacerlo de esta manera que escribir varias consultas que son esencialmente las mismas, aparte de eliminar combinaciones innecesarias.

Último consejo: intente abstraer las consultas en vistas. De esta manera, puede optimizar el rendimiento una vez, y quizás escribir las consultas de su informe de una manera más simple ...

0

Parece que hay dos cosas que está tratando de determinar: Si hay optimizaciones que se pueden hacer entre las dos declaraciones de selección, y cuál de las dos sería la más rápida de ejecutar.

Parece que, dado que la unión realmente está limitando los resultados devueltos por los autores que tienen libros en la lista, no se puede hacer tanta optimización.

También parece que, en el caso en que describió que la tabla unida realmente no tiene un efecto limitante en los resultados devueltos, la búsqueda donde no había unión de las tablas funcionaría más rápido.

Cuestiones relacionadas