Ver Mensaje Individual
  #2 (permalink)  
Antiguo 13/07/2015, 05:45
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Query que cuelga el ordenador (para Búsqueda Avanzada)

Y... hay muchas cosas.

Por empezar:
Cita:
Tengo las siguientes tablas en mi BBDD (que, según entiendo, es la correcta conforme a las Formas de Normalización):
En realidad no lo sabemos. Tendríamos que confiar en tus capacidades y tu palabra, pero por las experiencias que hemos tenido en el foro...
Como sea, sin verlo no estaremos seguros si está realmente como dices.

Luego:
Código MySQL:
Ver original
  1. AND atributo_1.type_id != -1
  2. AND atributo_2.genre_id != -1
  3. ...
  4. AND atributo_7.siete_id != -1
Es un asco de performance. La única forma en que se puede validar algo "diferente a " un valor discreto es comparando todos y cada uno de los registros, lo que implicaría un full table scan sobre el resultado de los JOINs.

Además:
Código MySQL:
Ver original
  1. AND items.item_name_en LIKE CONCAT('%','aaa','%')
Esta es una de esas condiciones decididamente espantosas
Esa condición, al DBMS le dice "lee TODOS los registros y buscá eso en cualquier parte de ese campo en cada registro".
No se recomienda usar los LIKE con comodines a ambos lados. Además, si el valor "aaa" entrase por variable, deberías asegurarte que la longitud de la palabra a buscar no sea menor a cinco letras, o se volverá MUY ineficiente.
Código MySQL:
Ver original
  1. AND items.issue_year >= 1900
  2. AND items.issue_year <= 3000
Si vas a buscar un rango, usa BETWEEN. En MySQL es ineficiente usar formas como esa.

Finalmente: Sin conocer la selectividad de cada tabla y de cada condición es imposible saber con certeza qué tan bien están armados los JOIN, porque en caso de no ser de buena selectividad estarías haciendo una forma de producto cartesiano.
Habría que realizar algunas pruebas con las tablas reales (me parece que estás dandonos nombres supuestos, lo que es mala práctica según las reglas del foro, que te sugiero leer), y con suposiciones o simulaciones las soluciones nunca son buenas..

Para que te des una idea, si la relación fuese exactamente la que dices, (80 000 * 1 000 * 1 000 * 5 000 * 9 0000), el total de registros en un producto cartesiano rondaría los 108.000.000.000.000.000.000.000...
TE conviene analizar antes que nada la performance de la query con el uso de EXPLAIN. Eso te dará una aproximación acerca de dónde falla tu consulta.

Explicanos qué es lo que intentaste para resolverlo y veamos qué cosas ya probaste. Asi no volvemos sobre los senderos caminados.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)