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

Tomar el ultimo dato sin tener que ordenar

Estas en el tema de Tomar el ultimo dato sin tener que ordenar en el foro de Mysql en Foros del Web. Buenos dias/tardes/noches! Estoy teniendo un problema bastante grande en un sistema que muestra el último dato de una tabla, lo estaba haciendo ordenando la tabla ...
  #1 (permalink)  
Antiguo 14/11/2011, 09:22
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Tomar el ultimo dato sin tener que ordenar

Buenos dias/tardes/noches!

Estoy teniendo un problema bastante grande en un sistema que muestra el último dato de una tabla, lo estaba haciendo ordenando la tabla por id descendente con un limite de 1 para solo tomar el ultimo, o sea:

Código MySQL:
Ver original
  1. SELECT dataval FROM etcom
  2. WHERE `Year`>='$cur_yea' AND `Month`>='$cur_mon' AND `Day`>='$cur_day' AND HOUR(Time)>$cur_hou
  3. AND Box='$eq' AND Sensor='$sn' ORDER BY Id DESC LIMIT 1;

el problema comenzo despues de un mes, esta tabla recibe 10.800 señales por hora, lo que hace un total de 7.776.000 señales al mes, pero lo que está retrazando la consulta es el ORDER BY (si quito el order by se ejecuta rapidamente pero muestra el primer dato en vez del último).

Demora mas de un minuto y el sistema se cae por tiempo máximo de ejecución excedida

Habia pensado solucionarlo haciendo algo así:

Código MySQL:
Ver original
  1. SELECT dataval FROM etcom
  2. WHERE `Year`>='$cur_yea' AND `Month`>='$cur_mon' AND `Day`>='$cur_day' AND HOUR(Time)>$cur_hou
  3. AND Box='$eq' AND Sensor='$sn' AND id=MAX(id) LIMIT 1;

pero me da error (Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource)

Espero que puedan ayudarme, se me están acabando las ideas D:

Gracias!
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #2 (permalink)  
Antiguo 15/11/2011, 03:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Tomar el ultimo dato sin tener que ordenar

Código MySQL:
Ver original
  1. SELECT Auto_increment FROM information_schema.tables WHERE table_name='etcom';

Esto te dará el proximo autoincrement de la tabla etcom.

Luego le restas 1 y consultas directamente por el id no hace falta que filtres por fecha ni nada....

$proximo el valor obtenido con la consulta anterior

$ultimo=$proximo-1;


Código MySQL:
Ver original
  1. SELECT dataval FROM etcom
  2. WHERE id=$ultimo;

Con 10.800 insersiones por hora puedes tener alguna colisión, es decir que cuando uses el valor ya no sea el ultimo.... pero si lo hacias con una consulta ordenada y te funcionaba, esto seguro que es mas rápido.... siempre que tengas acceso a "information_schema"


Tambien tienes la funcion LAST_INSERT_ID() pero depende de sesiones y quizas no te funciona.

Si quieres el ultimo de una fecha no sirve lo anterior

Código MySQL:
Ver original
  1. SELECT MAX(id) FROM etcom
  2. WHERE `YEAR`>='$cur_yea'
  3.         AND `MONTH`>='$cur_mon'
  4.         AND `DAY`>='$cur_day'
  5.         AND HOUR(TIME)>$cur_hou
  6.         AND Box='$eq'
  7.         AND Sensor='$sn';

esto te dará el id maximo de la fecha seleccionada

Luego puedes hacer esto

Código MySQL:
Ver original
  1. SELECT dataval FROM etcom
  2. WHERE id=(SELECT MAX(id) FROM etcom
  3. WHERE `YEAR`>='$cur_yea'
  4.         AND `MONTH`>='$cur_mon'
  5.         AND `DAY`>='$cur_day'
  6.         AND HOUR(TIME)>$cur_hou
  7.         AND Box='$eq'
  8.         AND Sensor='$sn');

No se si ira muy rapido....

Crear un indice sobre la fecha te podria mejorar la performance... incluso uno compuesto con la fecha, la box y el sensor...

Perdona no me habia fijado esta buscando fecha >= mayor o igual a la actual??? cur_XXX se suele usar como acronimo de current...

Código MySQL:
Ver original
  1. SELECT dataval FROM etcom
  2. WHERE id=(SELECT MAX(id) FROM etcom
  3. WHERE Box='$eq' AND Sensor='$sn');

con esto tienes el último de una box y sensor determinado.... el maximo es el ultimo no te lies con la fecha actual!!!
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 15/11/2011 a las 05:06
  #3 (permalink)  
Antiguo 15/11/2011, 12:48
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Tomar el ultimo dato sin tener que ordenar

Excelente respuesta, lo use y me resultó, el tiempo de respuesta ha disminuido a 0.25 segundos, lo cual esta totalmente dentro de lo aceptable!

muchas gracias!

+karma
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D

Etiquetas: dato, select, sql, tabla, tener, tomar, ultimo
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 03:44.