2010-06-13 14 views
8

Tengo 2 tablas:2 Seleccione o 1 consulta de unión?

libro (ID, título, edad) ----> 100 milions de filas

autor (id, book_id, nombre, nació) ----> 10 millones de filas

Ahora, supongo que tengo una identificación genérica de un libro. Necesito imprimir esta página:

Title: mybook 

authors: Tom, Graham, Luis, Clarke, George 

Entonces ... ¿cuál es la mejor manera de hacer esto?

1) se unen a simple como esto:

Select book.title, author.name 
From book, author 
WHERE (author.book_id = book.id) AND (book.id = 342) 

2) Para evitar la unión, que podría hacer 2 consulta sencilla:

Select title FROM book WHERE id = 342 

Select name FROM author WHERE book_id = 342 

¿Cuál es la manera más eficiente?

Respuesta

8

El primero. Es solo un viaje de ida y vuelta. Se requiere un poco de procesamiento para colapsar las filas de autores en una lista separada por comas como desee, pero eso es básicamente un código repetitivo.

Las consultas relacionadas separadas son un mal hábito que matará su rendimiento más rápido que la mayoría de las cosas.

+0

La base de datos no contrae las filas en una lista separada por comas, el cliente presumiblemente con algún lenguaje de scripting. –

+1

@Evan - Se puede hacer con GROUP_CONCAT o similar. –

+0

No dije que no podría hacerse. Solo quise dar a entender que no se está haciendo y que es externo a la pregunta. –

2

La mejor opción es ejecutar pruebas de velocidad en su propio servidor. Según la frecuencia con la que se acceda a las diferentes tablas juntas y separadas, cualquiera de las dos podría ser más rápida.

Esto ha sido contestada en profundidad antes: LEFT JOIN vs. multiple SELECT statements

1

El primero de ellos, y sobre todo si tiene un índice en author.book_id. Un índice cerrado sería lo mejor si tiene muchos autores y es posible, de lo contrario un no cerrado también lo ayudaría mucho.

0

Sé que no debería ser una consideración, pero la primera consulta le devolverá un conjunto de resultados como esto:

title  name 
----------------- 
mybook Tom 
mybook Graham 
mybook Luis 
mybook Clarke 
mybook George 

mientras que el segundo par se devolverá un par de conjuntos de resultados de la siguiente manera:

title 
------- 
mybook 

y

name 
-------- 
Tom 
Graham 
Luis 
Clarke 
George 

por lo que cada método devuelve los datos de una manera diferente. En este ejemplo simple, la repetición del título del libro no va a ser significativa, pero si en lugar del título devolviera el primer capítulo (por ejemplo), entonces sería menos eficiente, ya que habría una gran cantidad de datos repetidos. Por lo tanto, aunque el segundo podría tomar más tiempo en la base de datos, podría ser más rápido y más eficiente al enviar esa información a través de la red.

Necesita probar sus resultados reales y ver cuál funciona mejor.

+0

sí, lo sé ... pero quiero saber cuál es la forma más eficiente :) – xRobot

+1

Puede que sea mejor que si VI o Emacs son mejores. No hay una respuesta "correcta" para todas las situaciones. Ejecute cien o mil consultas de prueba utilizando bucles y vea qué tarda más. El uso el otro. –

+0

@ Aaron, buena analogía. – ChrisF

1

La minimización de viaje redondo y la promoción de planes de ejecución en buen estado son los elementos más destacados en mi lista de rendimiento.

Si tiene una situación con dependencias estáticas entre campos en una consulta que impide que el optimizador use un índice, dividirlas en consultas separadas puede proporcionar grandes ganancias de rendimiento a medida que se usan los índices y aumenta el recuento de filas del conjunto de datos. Para la mayoría de los protocolos de transporte de bases de datos, los conjuntos de resultados adicionales equivalen a viajes de ida y vuelta adicionales. Esto puede tener implicaciones de rendimiento si se accede regularmente a los datos a través de una WAN. Por suerte, hay maneras de tener su pastel y comérselo también:

Select title,NULL AS name FROM book WHERE id = 342 
UNION ALL 
Select NULL,name FROM author WHERE book_id = 342 

En el ejemplo específico que elegiría # 1 con una advertencia a considerar lo que sucedería si no hubiera autores de archivo para un libro dado.

Cuestiones relacionadas