Ver Mensaje Individual
  #3 (permalink)  
Antiguo 13/07/2015, 10:14
ersito
 
Fecha de Ingreso: julio-2008
Mensajes: 84
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Query que cuelga el ordenador (para Búsqueda Avanzada)

Muchas gracias por contestar gnzsoloyo.

A ver, ea query es solo un ejemplo que recoge campos para ver qué hay en base de datos. Ya sé que no está bien, pero era solo demostrar que una consulta así no puede hacer que se vuelgue el ordenador (que tarde sí, que casque el ordenador no).

El ejemplo completo que hace que falle sería este.
Esta consulta saca los generos de unos items (hay unos 1000 géneros y la tabla que relaciona géneros con items tiene unos 70.000 registros)

Código MySQL:
Ver original
  1. SELECT COUNT(i.item_id)
  2. FROM items i, item_tipos it, item_tipos_asociados ita
  3. WHERE i.item_id = ita.item_id
  4. AND ita.type_id = it.type_id
  5. AND it.type_id = 3

Saco los items con el género 3. Hay unos 300 géneros y unos 50.000 relaciones de género-item. Esto devuelve 50 resultados.

Lo mismo para categorías:
Código SQL:
Ver original
  1. SELECT COUNT(i.item_id)
  2. FROM items i, items_categorias ic, items_categorias_asociados icd
  3. WHERE i.item_id = icd.item_id
  4. AND icd.item_category_id = ic.item_category_id
  5. AND ic.item_category_id = 3

Y para las categorias 3. Hay unos 100 géneros y unos 80.000 relaciones de categorias-item. hay 10 reultados

Lo mismo con publishers (60 publishers y 30.000 resultados de relacion publisher-item) y developer (400 developer y 20.000 resultados de relación developer-item):

Código MySQL:
Ver original
  1. SELECT COUNT(i.item_id)
  2. FROM items i, item_publishers ip, item_publisher_asociados ipa
  3. WHERE i.item_id = ipa.item_id
  4. AND ipa.publisher_id = ip.publisher_id
  5. AND ip.publisher_id = 3

Código MySQL:
Ver original
  1. SELECT COUNT(i.item_id)
  2. FROM items i, item_developers id, item_developer_asoc ida
  3. WHERE i.item_id = ida.item_id
  4. AND ida.developer_id = id.developer_id
  5. AND id.developer_id = 3;

Con 40 resultados el primero y 20 el segundo.

Si ahora hago un union de todas las consultas, sólo para ver lo que tarda, ya sé que con solo un union se repiten resultados y no es correcta. Es sólo para ver lo que tarda:
Código MySQL:
Ver original
  1. SELECT COUNT(i.item_id)
  2. FROM items i, item_generos ig, item_generos_asociados iga
  3. WHERE i.item_id = iga.item_id
  4. AND iga.genre_id = ig.genre_id
  5. AND ig.genre_id = 3
  6.  
  7.  
  8. SELECT COUNT(i.item_id)
  9. FROM items i, item_tipos it, item_tipos_asociados ita
  10. WHERE i.item_id = ita.item_id
  11. AND ita.type_id = it.type_id
  12. AND it.type_id = 3
  13.  
  14.  
  15. SELECT COUNT(i.item_id)
  16. FROM items i, items_categorias ic, items_categorias_asociados icd
  17. WHERE i.item_id = icd.item_id
  18. AND icd.item_category_id = ic.item_category_id
  19. AND ic.item_category_id = 3
  20.  
  21.  
  22. SELECT COUNT(i.item_id)
  23. FROM items i, item_publishers ip, item_publisher_asociados ipa
  24. WHERE i.item_id = ipa.item_id
  25. AND ipa.publisher_id = ip.publisher_id
  26. AND ip.publisher_id = 3
  27.  
  28.  
  29. SELECT COUNT(i.item_id)
  30. FROM items i, item_developers id, item_developer_asoc ida
  31. WHERE i.item_id = ida.item_id
  32. AND ida.developer_id = id.developer_id
  33. AND id.developer_id = 3;

Ahí es cuando se cuelga el ordenador y ya no hace nada.
Ese el es problema, ya que no hay tantos resultados para que se cuelgue la máquina.

Última edición por gnzsoloyo; 13/07/2015 a las 10:57 Razón: SQL sin etiquetar. Usar Highlight "SQL", por favor.