Ver Mensaje Individual
  #7 (permalink)  
Antiguo 24/11/2014, 13:08
Avatar de gnzsoloyo
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: 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)