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

Problemas con LOW QUERY Mysql

Estas en el tema de Problemas con LOW QUERY Mysql en el foro de Mysql en Foros del Web. Hola buenas, Estoy visualizando las Low Query y tengo una consulta de tipo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT           ...
  #1 (permalink)  
Antiguo 11/03/2013, 00:12
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Problemas con LOW QUERY Mysql

Hola buenas,

Estoy visualizando las Low Query y tengo una consulta de tipo:
Código MySQL:
Ver original
  1.             id,texto_1,foto,ocultar_reg_gratis
  2.         FROM
  3.             servicios_cat as a
  4.         WHERE
  5.         (
  6.             fecha != ''
  7.         )
  8.         ORDER BY
  9.             ordenado ASC;
Donde poner el indice?

Actualmente tengo:
Código SQL:
Ver original
  1. ALTER TABLE  `servicios_cat` ADD INDEX  `servicios_cat3` (  `fecha` );
Pero me dice:
Código MySQL:
Ver original
  1. # Time: 130311  7:08:01
  2. # User@Host: xxxx[xxxxx] @ localhost [127.0.0.1]
  3. # Query_time: 0.000000  Lock_time: 0.000000 Rows_sent: 6  Rows_examined: 12
  4. SET timestamp=1362982081;
  5.             id,texto_1,foto,ocultar_reg_gratis
  6.         FROM
  7.             servicios_cat as a
  8.         WHERE
  9.         (
  10.             fecha != ''
  11.         )
  12.         ORDER BY
  13.             ordenado ASC;
Muchas gracias
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------


Última edición por gnzsoloyo; 11/03/2013 a las 04:08 Razón: SQL mal resaltado y sin etiquetar
  #2 (permalink)  
Antiguo 11/03/2013, 04:09
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
Respuesta: Problemas con LOW QUERY Mysql

Ajá... Y lo que quieres saber sería...



¿Qué?

Recordemos que una "low query" es una consulta que lleva más tiempo que el definido en un parámetro configurable de MySQL, y se suele utilizar para saber qué consultás podrían ser optimizadas.

Lo que sí creo que no tienes claro es que un campo de fecha no puede contener un espacio vacío. O es NULL, o bien contiene una fecha en cero, pero no es un espacio vacío porque un campo de fecha no es un VARCHAR... a menos que hayas cometido el enorme error de poner la fecha en un VARCHAR... Lo que podría explicar el problema de performance.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/03/2013, 04:14
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Problemas con LOW QUERY Mysql

Me gustaría saber que indice tendría que crear sobre esta consulta para que no tenga en el log LOW QUERY
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #4 (permalink)  
Antiguo 11/03/2013, 06:29
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
Respuesta: Problemas con LOW QUERY Mysql

Puede no ser necesariamente un índice, sino los datos o los parámetros de búsqueda.
Por lo pronto, cuando buscas fechas, si no buscas un rango o una fecha, es mejor qu eel campo a buscar esté en '000000-00-00', o bien sea nulable, porque eso sí impactaría en el uso del índice.
Pero cuando buscas algo que sea "distinto de", el parser no puede, desde el principio, establecer cuál de los valores del índice es diferente, por lo que descarta el uso del mencionado índice y pasa a realizar un tablescan, lo que es el peor escenario posible en cualquier DBMS.
¿Se entiende?
Además de eso, es conveniente no abusar de los paréntesis, y usarlos sí y sólo si es necesario, que no es tu caso, porque pueden tener un mal impacto en el plan de la consulta.

Por otro lado, no me has respondido: ¿Cómo tienes configurado el campo de la fecha?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 11/03/2013, 07:24
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Problemas con LOW QUERY Mysql

Y si eliminó el where no pondría indices por Que la consulta mostrada arriba es lo mismo Que sin el where por Que todos los registros fecha están Como 2013-04-01 Como ejemplo.
Eliminare todos los paréntesis del where si no son necesarios.

Entonces en el Log Query siempre me lo mostrará?

Aré indices a buscar en el where y no Como IS NOT
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #6 (permalink)  
Antiguo 11/03/2013, 07:55
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
Respuesta: Problemas con LOW QUERY Mysql

Tengo la impresión de que sigues sin entenderme bien.
1) ¿Qué tipo de dato usa la columna "fecha"?
2) Te conviene que sea nulable.
3) En las fechas, es preferible hacer búsquedas por rango, y no por diferente a.
4) Las búsquedas por "diferente de" son siempre ineficientes. Generan table scan.
5) El WHERE no es optimizable, pero puede determinar si aprovechará os índices.
6) No se puede determinar a priori que una consulta el el LOW QUERY implique ineficiencia de consulta, porque eso dependerá de varios factores. Que aparezca o no, lo determina el tiempo definido en su variable de sistema. Pero si esa variable estuviese puesta en 20 segundos, por ejemplo, y la consulta dura 21 segundos, tu supones que es lenta, y eso puede no ser necesariamente cierto.
Una consulta puede ser rápida con 230 segundos de duración, si procesase, por ejemplo, 2.000.000.000 de registros, realizando JOINS con otras tablas con 10.000.000 registros para obtener algunos miles de registros resultantes. Y en ese contexto, no creo que podamos hablar de una consulta "lenta"... ¿No te parece?
En tu caso, podemos decir, sin siquiera mirar el log de low query, que tu consulta es ineficiente incluso aunque la tabla tuviese 10 registros. Y se puede decir eso porque el "fecha != ''" es de entrada una condición absolutamente ineficiente. Ni siquiera tengo que ejecutarla para saber que es mala.
¿Se va entendiendo?
No es sólo la estritura, ni los indices. Es el contexto lo que define si es o no optimizable.
El LOW QUERY es una guía, no una definición absoluta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: low, query, select
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 19:39.