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

Consulta tarda mucho

Estas en el tema de Consulta tarda mucho en el foro de Mysql en Foros del Web. Hola el caso esque tengo esta consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT * FROM  apartamentos WHERE apartamentos . id_a NOT IN     ...
  #1 (permalink)  
Antiguo 12/11/2014, 12:32
 
Fecha de Ingreso: enero-2010
Mensajes: 373
Antigüedad: 14 años, 3 meses
Puntos: 5
Consulta tarda mucho

Hola el caso esque tengo esta consulta:

Código SQL:
Ver original
  1. SELECT * FROM  apartamentos WHERE apartamentos.id_a NOT IN  
  2.     (
  3.     SELECT id_a FROM timer WHERE TIMESTAMP='$tim'
  4.  )
Y tarda como unos 18 segundos en ejecutarse ya que la segunda tabla es algo grande, hay otra manera de hacerlo y que tarde menos??

Última edición por gnzsoloyo; 12/11/2014 a las 12:54
  #2 (permalink)  
Antiguo 12/11/2014, 12:54
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, 4 meses
Puntos: 2658
Respuesta: Consulta tarda mucho

¿El campo "timestamp" está indexado?
__________________
¿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 12/11/2014, 13:36
 
Fecha de Ingreso: enero-2010
Mensajes: 373
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: Consulta tarda mucho

No se que quieres decir con que si lo tengo indexado
  #4 (permalink)  
Antiguo 12/11/2014, 16:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta tarda mucho

Hola kai89:

Cita:
No se que quieres decir con que si lo tengo indexado
Checa esta liga: estoy seguro que te será de gran ayuda ahora y en el futuro

http://lmgtfy.com/?q=indexar+campo+mysql

Saludos
Leo
  #5 (permalink)  
Antiguo 12/11/2014, 16:42
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, 4 meses
Puntos: 2658
Respuesta: Consulta tarda mucho

Cita:
Iniciado por kai89 Ver Mensaje
No se que quieres decir con que si lo tengo indexado
Es lo mismo que si me dijeses que no sabes nada de Bases de Datos y que jamás trabajaste con SQL...

Sin ofender.

Se dice "indexado" cuando se ha creado un índice sobre un campo o conjunto de campos. Supongo que sí sabes qué es un índice en Bases de Datos, ¿no?

Si no has creado un indice sobre ese campo, entonces hazlo ya mismo y vuelve a probar.

13.1.11 CREATE INDEX Syntax
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 24/11/2014, 12:41
 
Fecha de Ingreso: enero-2010
Mensajes: 373
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: Consulta tarda mucho

gnzsoloyo hablarás sin animos de ofender, pero aunque yo no soy un experto en mysql, se perfectamente trabajar con bases de datos en mysql, y porsupuestisimo que tengo un indice en la tabla que dije, ya que un indice si se lo que es, otra cosa es que no supiera el significado de un campo indexado.

Asi que la proxima vez antes de juzgar informate de a quien juzgas.
  #7 (permalink)  
Antiguo 24/11/2014, 13:08
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, 4 meses
Puntos: 2658
Respuesta: Consulta tarda mucho

Lamento que te ofendas por tan poco, pero yo hice la observación partiendo de tu propia frase:
Cita:
No se que quieres decir con que si lo tengo indexado
Como dije, es una afirmación que que sólo se explica por desconocimiento de lo que es un índice, y es eso lo que te pregunté, además de ser lo que más de uno parece haber interpretado. Pero si dices que tienes conocimiento de qué entonces podremos pasar al siguiente punto:

Ok. Estas haciendo la consulta por programación, por lo que si tienes un índice en esa sola columna, debería funcionar mejor de lo que dices, así que existe una posibilidad: El formato del dato genera el descarte del índice.
Esto suele pasar cuando el formato del dato no respeta el que MySQL espera y que está definido como clave de índice. En tales casos MYSQL automáticamente descarta el índice y hace un full table scan, lo que es un espanto para la performance.
Como el dato lo estás poniendo por programación, dependerá de qué tan bien lo construyas el saber si está llegando una consulta optimizada.
¿Se entiende el problema?

Para ser más especifico, la query funcionará bien si lo que se recibe es esto:
Código SQL:
Ver original
  1. SELECT * FROM  apartamentos
  2. WHERE apartamentos.id_a NOT IN  (SELECT id_a FROM timer WHERE TIMESTAMP='2014-11-21 00:00:00')
y funcionará un poco menos eficiente si llega esto:
Código SQL:
Ver original
  1. SELECT * FROM  apartamentos
  2. WHERE apartamentos.id_a NOT IN  (SELECT id_a FROM timer WHERE TIMESTAMP='2014-11-21')
porque obliga a MySQL a hacer conversiones implícitas, que afectan la performance.

Por otro lado, si siempre llegará bien formateado, lo mejor es usar la funcion de conversion nativa:
Código SQL:
Ver original
  1. SELECT * FROM  apartamentos
  2. WHERE apartamentos.id_a NOT IN  (SELECT id_a FROM timer WHERE `TIMESTAMP`= TIMESTAMP('2014-11-21 00:00:00'))
;


De todos modos sería mejor verificar qué tan bien está llegando la query...

¿Podrás postear una query sin la variable, sino con el valor que la variable le asigna al crear la consulta?

Nota final, ten en cuenta que hago mención al principio de que tengas ese índice definido en esa sola columna, y no entre esa y otras columnas al mismo tiempo.
Esto es crítico porque MySQL usará el índice en función de los datos que se leen y los que se validan, por lo que si tienes tres indices sobre esa columna, pero todos en combinacion con otro dato, en tu query no usará ninguno de ellos, porque sólo estás poniendo ese dato como WHERE.

Finalmente, yo probaría esta sintaxis:
Código SQL:
Ver original
  1. SELECT *
  2. FROM  apartamentos A INNER JOIN (SELECT id_a FROM `timer` T.`TIMESTAMP`= TIMESTAMP('2014-11-21 00:00:00')) T ON A.id_a = T.id_a
  3. WHERE T.id_a IS NULL;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 24/11/2014, 13:45
 
Fecha de Ingreso: enero-2010
Mensajes: 373
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: Consulta tarda mucho

Solo fue que no me gusto la manera primera de responder,porque aunque no sepas lo que significa una palabra no siginifica que no entiendas nada, aunque yo no soy un experto en mysql.

Por otro lado, agradezco tu información voy a probar y te cuento que tal ha ido.
  #9 (permalink)  
Antiguo 26/11/2014, 07:25
 
Fecha de Ingreso: enero-2010
Mensajes: 373
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: Consulta tarda mucho

Que bien ya va bien! finalmente utilice esta:

Cita:
SELECT * FROM apartamentos
WHERE apartamentos.id_a NOT IN (SELECT id_a FROM timer WHERE `TIMESTAMP`= TIMESTAMP('2014-11-21 00:00:00'))
Creo que el problema era que no definia en la consulta el campo como TIMESTAMP

Muchas gracias y saludos.
  #10 (permalink)  
Antiguo 26/11/2014, 09:17
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, 4 meses
Puntos: 2658
Respuesta: Consulta tarda mucho


__________________
¿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: select, tabla, tarda
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 11:19.