MySQL - Subconsulta muy lenta, pasar a join?

 
Vista:

Subconsulta muy lenta, pasar a join?

Publicado por Jose Carlos (7 intervenciones) el 29/08/2012 17:49:17
Hola a todos de nuevo, tengo una consulta de mysql la cual funciona bien el problema es cuando trato de hacer la consulta en toda la tabla, ésta tabla con la que trabajo es muyyyyyyy grande y he leído que las subconsultas tienen pésimo rendimiento con tablas tan grandes, no se si cambiar la consulta con un join, si es así lo intenté pero me marca un error tras otro, ¿alguien tiene una mejor idea?

el query es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
   plan.numero_prestamo,
   plan.numero_cuota,
   plan.numero_cuota+1 AS proxima_cuota,
   plan.periodo,
   plan.codigo_tipo_saldo,
FROM
   pr_saldos_plan_pago_mes plan
WHERE
   plan.numero_prestamo = 1 AND
   plan.numero_cuota IN
      ( SELECT
            MAX( numero_cuota ) AS ultima_cuota
        FROM
            pr_saldos_plan_pago_mes
        WHERE
            numero_prestamo = 1 )


Este query me arroja bien los resultados, solo que pueden notar que hay un filtro "where" con el cual me arroja solo los numero de prestamo = 1, la idea es que me arroje todos los demás, pero al quitarle los where la consulta se vuelve eterna, lleva ejecutándose 20 hrs y aún no tengo respuesta, cabe destacar que hay mínimo 50mil créditos diferentes, es decir, es una gran tabla, no me importa esperar mucho tiempo en el query, pero mas de 20hrs??? imposible, necesito reducirlo a máximo poco mas de una hora....los resultados con el where incluido son:

1
2
3
4
5
6
numero_prestamo	numero_cuota	proxima_cuota	periodo	codigo_tipo_saldo
1		153		154		12		55
1		153		154		12		6
1		153		154		12		2
1		153		154		12		53
1		153		154		12		1


Alguien tiene una idea de como optimizar éste proceso???? muchas gracias de antemano!

PD: otra idea que tuve era hacer la consulta sin subconsulta, mas simplificado como:

1
2
3
4
5
6
7
8
9
SELECT *
FROM
   pr_saldos_plan_pagos
WHERE
   numero_prestamo = 1
ORDER BY
   numero_cuota DESC
LIMIT
   5


El resultado da el mismo, el gran problema es que el "limit 5" tendría que ser variable siempre, ya que cada numero de prestamo varía la cantidad de numero de cuota, en este caso es 5, pero puede ser 1, puede ser 3, puede ser 9, etc, etc. eso destruye la lógica
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Subconsulta muy lenta, pasar a join?

Publicado por xve (1151 intervenciones) el 29/08/2012 19:10:11
Hola Jose Carlos, nosotros movemos tablas que diariamente se le añaden unos 40.000 registros, llevando mas de 20 millones de registros y no tenemos ningún problema de lentitud.
Que índices tienes definidos?? nos los puedes mostrar??
1
SHOW INDEX FROM NombreTabla;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Subconsulta muy lenta, pasar a join?

Publicado por Jose Carlos (7 intervenciones) el 29/08/2012 19:15:07
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
+-------------------------+------------+---------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                   | Non_unique | Key_name                        | Seq_in_index | Column_name       | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------------------+------------+---------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            1 | periodo           | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            2 | numero_prestamo   | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            3 | numero_cuota      | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            4 | codigo_tipo_saldo | A         |    73741748 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes                        |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | numero_prestamo                 |            1 | numero_prestamo   | A         |      508563 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | codigo_tipo_saldo               |            1 | codigo_tipo_saldo | A         |         346 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | periodo                         |            1 | periodo           | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo               |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo               |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_tipo_saldo    |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_tipo_saldo    |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_tipo_saldo    |            3 | codigo_tipo_saldo | A         |    14748349 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota         |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota         |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota         |            3 | numero_cuota      | A         |    36870874 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            3 | numero_cuota      | A         |    36870874 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            4 | codigo_tipo_saldo | A         |    73741748 |     NULL | NULL   |      | BTREE      |         |               |
+-------------------------+------------+---------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
20 rows in set (0.02 sec)


ese fue el resultado, espero no tener que cambiar los index, porque no creo poder tocar esa base de datos la verdad, son las que nos pasan los bancos :S, pero ahí esta la info por cualquier cosa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar