Acelerar una consulta mysql y php

Estoy programando en php y mysql y tengo una consulta bastante pesada.
Dicha consulta se realiza sobre una tabla con más de 100.000 registros y debe devolver las líneas que cumplan:
- Encontrarse entre dos fechas y tener un cierto valor en el campo clase (salen unos 15.000 registros)
Y ahora viene lo pesado: comprobar cuales de esos 15.000 registros coinciden con alguno de entre ellos mismos en 3 campos pero no en el código.
Ahora mismo está funcionando realizando un cruce de esa tabla consigo misma, haciendo un where delimitado por fechas y clase y pidiendo que 1.c1=2.c1, 1.c2=2.c2 y 1.c3=2.c3 pero 1.c4<>2.c4 (siendo c1-4 los campos correspondientes y 1 y 2 los alias de la tabla).
He indexado esos campos consiguiendo algo más de velocidad y he probado a crear una tabla temporal con los 15.000 registros y hacer el cruce después, pero sigue siendo demasiado lenta.
¿Alguna idea de como acelerarlo?
Muchas gracias.
PD: se me había ocurrido realizar miles de pequeñas consultas, una por cada línea extraída de los 15.000 registros, pero creo que va a ser aún más lento.

1 respuesta

Respuesta
1
Supongo que los indices que has creado son en los campos "fecha", "clase", "c1", "c2", "c3" y "c4", ¿no?.
¿ Como estas haciendo la comparacion de fechas ? Usas "fecha >= fecha inicial AND fecha <= fecha_final" o usas "fecha BETWEEN fecha_inicial AND fecha_final". El primer método es mucho más rapido.
Ya me comentas.
Pues usaba between, pero cambiaré al otro método.
En el caso de los índices, clase no está indexada, pero en la tabla temporal que creo no aparece tal campo, hago la consulta temporal añadiendo solo aquellos que cumplen la cláusula de la clase.
Por ahora el método de las subtablas es el que mejores resultados me está dando.
Gracias.
¿Podrías pasarme la estructura de todas las tablas implicadas en la consulta, incluida la temporal?
La primera tabla tiene 16 campos de tipo texto que no intervienen en la consulta además de los campos:
Código: campo clave, autonumérico
Expediente: campo indexado, texto(350)
Empresa: campo indexado, texto(700)
CP: campo indexado, texto(250)
Fecha: campo indexado, tipo fecha.
Clase: tipo texto(100), no indexado
Resto de campos(16): tipo texto o numéricos, no indexados
Es de tipo InnoDB, montada sobre mysql 5.1
La tabla temporal tiene la misma estructura que la anterior, salvo que el campo código no es autonumérico pero sigue siendo la clave y que solo tiene estos campos
código: campo clave, numérico
expediente: campo indexado, texto(350)
Empresa: campo indexado, texto(700)
CP: campo indexado, texto(250)
Fecha: campo indexado, tipo fecha.
En tu argumentación inicial hacías referencia a unos campos, c1 a c4... ¿cuáles son?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas