Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

EXPLAIN..... y la consulta

Estas en el tema de EXPLAIN..... y la consulta en el foro de Mysql en Foros del Web. buen dia.... tengo un duda existencial..... ojala y alguien me pudiera dar una buena explicacion.... * Tengo una tabla con poco mas de 8, 000, ...
  #1 (permalink)  
Antiguo 10/12/2007, 12:48
 
Fecha de Ingreso: febrero-2007
Mensajes: 13
Antigüedad: 17 años, 2 meses
Puntos: 0
EXPLAIN..... y la consulta

buen dia....

tengo un duda existencial..... ojala y alguien me pudiera dar una buena explicacion....

* Tengo una tabla con poco mas de 8, 000, 000 de registros
* El campo fecha con su respectivo indice

Consulta # 1 SELECT fecha FROM tabla WHERE fecha BETWEEN '2007-01-01' AND '2007-12-31'
se tarda aproximadamente 10 segundos en ejecutar la consulta que la verdad se me hace bastante normal ya que arroja poco mas de 3 millones de registro.

Al hacerle un EXPLAIN a esa consulta en la parte de "Extra" me arroja using where; using index en pocas palabras SI esta utilizando el indice correctamente.

Pero que sucede si a esa misma consulta le hacemos lo siguiente SELECT * FROM tabla WHERE fecha BETWEEN '2007-01-01' AND '2007-12-31' la cual se tarda demasiado tiempo en ejecutarla digamos de 3 a 4 minutos

Al darle un EXPLAIN a esa consulta en la parte de "Extra" solo dice using where por consecuencia ya no esta utlizando el indice. en la parte de "key" aparece como NULL.

No quisiera que me dijeran como arreglar la consulta ya que a partir de ahi se van a generar consultas mucho mas complejas.

Ya busque por medio manual de MySQL sin respuesta alguna.

Espero y alguien me puede ayudar =P
  #2 (permalink)  
Antiguo 10/12/2007, 17:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: EXPLAIN..... y la consulta

El problema de acudir al Manual de Referencia de MySQL es que no profundiza mucho en uno de los aspectos cruciales de bases de datos: La optimización.
Sobre el tema hay mucho y bastante completo y COMPLEJO. Respecto de eso te sugiero que trates de obtener bibliografía específica de optimización, tal como Database Tuning Principles. Experiments and Troubleshooting Techniques, de Morgan - Kaufmann.
De todos modos, aquí van algunos tips:

1. MySQL no sabe como optimizar el WHERE y MENOS si en él hay constantes, como las constantes de texto (las fechas) que pusiste en la consulta. Por más que sean fechas, al colocarlas entre apóstrofos (') se vuelven strings, y por consiguiente se transforman en constantes.

2. Elimine inicialmente tantas filas como pueda. Use una consulta de alta selectibilidad. En el caso, si está consultando por un conjunto que devuelve 3.000.000 de registros comprendidos entre 365 días, es muy posible que haya algún campo más que sea determinante (p.e. en la facturación bien pueden ser los ID de productos o los ID de clientes) y que permita eliminar una inmensa cantidad de registros que no son los que busca.
Incluso puede ser que la selección por fecha funcione bien o mejor aún, si el conjuto de fechas de comparación surge de una subconsulta y no de un rango.

3. Los índices son fundamentales. Si existe un índice que exista sobre los mismos campos que se buscan, MySQL leerá el índice y no las tablas.

4. Trate de evitar la lectura a disco. Hay que aprovechar los 64Kb de paginación estándar para que almacene allí todos los datos seleccionados desde el inicio, así las consultas corren en memoria. Eso se hace calculando la longitud del registro devuelto por la cantidad de registros que serán leídos (usando el EXPLAIN, p.e.)

5. Si se usan JOINS, hay que probar todas las posibilidades de ordenamiento en los JOIN. No todos son igual de eficientes.

6. Importante: No consulte por datos que no va a usar. ¿Realmente necesita consulta así: SELECT * FROM ...?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:12.