4 messages in com.mysql.lists.mysql-esRE: Diseñar una base de datos para ut...
FromSent OnAttachments
Rafael Lopez Font11 Jan 2006 03:22 
Gilberto García11 Jan 2006 04:46 
Marcelo Yornet11 Jan 2006 11:44 
ISC Edwin Cruz11 Jan 2006 12:07 
Subject:RE: Diseñar una base de datos para utilizarla como Cola (queue) (+ de 250.000 registros, sin duplicados)
From:Gilberto García (ggar@melexa.com)
Date:01/11/2006 04:46:47 AM
List:com.mysql.lists.mysql-es

Rafael, Intenta colocar una llave primaria con el id de la tabla queue, como este es incremental no habria problema y las busquedas las estas haciendo en base a este id.

Saludos,

Gilberto

-----Mensaje original----- De: Rafael Lopez Font [mailto:rafa@vaelsys.com] Enviado el: miércoles, 11 de enero de 2006 6:23 Para: mysq@lists.mysql.com Asunto: Diseñar una base de datos para utilizarla como Cola (queue) (+ de 250.000 registros, sin duplicados)

Buenas a todos.

El escenario es el siquiente:

Estoy diseñando una base de datos para utilizarla como cola de trabajos (primero en llegar, primero en salir). Tengo varios ordenadores (en principio 2) que van a acceder a la BD para obtener el siguiente elemento de la cola, procesarlo, añadir nuevos trabajos a la cola si es necesario, pedir el siguiente, ...

Actualmente lo tengo diseñado de la siguiente manera:

CREATE TABLE queue ( trabajo text NOT NULL, depth int(3) default 0, id int(11) default 0 );

1.- Al añadir un nuevo elemento a la cola le asigno un id que va autoincrementando.

INSERT INTO queue ( trabajo, depth, id ) VALUES ('trabajo a realizar', depth, counter++);

2.- Pero antes compruebo si ya esta en la base de datos:

SELECT trabajo FROM queue WHERE trabajo LIKE 'trabajo a realizar')

3.- Al sacar tengo una variable (compartida por los dos ordenadores) que me indica el siguiente id a sacar. cada vez que saco incremento esta variable.

SELECT trabajo, depth FROM queue WHERE id = next++

Pero cuando paso de 50.000 registros el rendimiento disminuye considerablemente

Para el punto 3 se me ocurre la optimización de sacar de 500 en 500 (o de 10 en 10), pero el problema principal viene en el punto 2, al comprobar duplicados. Y no se me ocurre ninguna manera de optimizar ese punto. Tal vez el problema principal esté en el diseño pero no se me ocurre nada.

Otro problema grande es que el campo trabajo es una cadena de caracteres de longitud muy variable (de 2 hasta 1700) por lo que no puedo utilizar ni PRIMARY KEY ni UNIQUE para que mysql se encargue de los duplicados u optimizar la consulta del punto 2.

¿Alguna sugerencia para implementar esta cola en mysql?

Muchas Gracias

Rafa

pd: se me olvidaba. Utilizo java con el driver de mysql.