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

¿Cuál de estas queries es más rápida?

Estas en el tema de ¿Cuál de estas queries es más rápida? en el foro de Mysql en Foros del Web. Hola a todos, los molesto con una consulta específica. Dada una tabla con los siguientes campos: Código: id -> bigint rel_id -> bigint key -> ...
  #1 (permalink)  
Antiguo 18/10/2010, 02:41
Avatar de RickJ  
Fecha de Ingreso: abril-2010
Mensajes: 5
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta ¿Cuál de estas queries es más rápida?

Hola a todos, los molesto con una consulta específica.

Dada una tabla con los siguientes campos:
Código:
id -> bigint
rel_id -> bigint
key -> varchar(255)
value -> longtext
Y con los siguientes datos:
Código:
ID  REL_ID  KEY       VALUE
1   1       nombre    pepe
2   1       apellido  perez
3   1       valores   2,4,7
4   2       nombre    luis
5   2       apellido  gomez
6   2       valores   5,7,12
7   3       nombre    carlos
8   3       apellido  diaz
9   3       valores   3,4,8
10  4       nombre    carlos
11  4       apellido  diaz
12  4       valores   2,5,8
Necesito una query que devuelva el campo REL_ID para todas las filas que contengan "valores" en el campo KEY, y que contengan uno o más valores específicos (pongamos, por ejemplo, 2 y 8) en el campo VALUE.

Se me ocurren tres posibles soluciones. La primera:

Código:
SELECT rel_id
   FROM tabla
   WHERE key = 'valores'
   AND FIND_IN_SET(2,value)
   AND FIND_IN_SET(8,value)
La segunda implica guardar el contenido del campo VALUE con una coma más al principio y otra al final (ej. ",2,5,8," en lugar de "2,5,8"), y es:

Código:
SELECT rel_id
   FROM tabla
   WHERE key = 'valores'
   AND value LIKE "%,2,%"
   AND value LIKE "%,8,%"
La tercera se basa en la segunda e implica ordenar los valores de forma creciente, además de guardar el contenido del campo VALUE con dos comas de separación en lugar de una (ej. ",,2,,5,,8,," en lugar de ",2,5,8,"), y es:

Código:
SELECT rel_id
   FROM tabla
   WHERE key = 'valores'
   AND value LIKE "%,2,%,8,%"
Las tres funcionan; mi duda tiene que ver con la performance. La implementación real será en un sitio de alto tráfico, va a tener unos cuantos valores más en el campo VALUE y va a ser necesario filtrar por más de dos de ellos (podrán ser unos cinco o seis), y considerando que esta funcionalidad es el corazón del proyecto en cuestión, necesito que el query sea lo más rápido y eficiente posible. Valga mencionar que modificar la estructura de las tablas no es, lamentablemente, una opción viable.

Lo que sí es una opción válida es utilizar, en el campo VALUE, palabras en vez de números (esos números se corresponden con IDs en otra tabla), cosa de aplicar el FIND_IN_SET o el LIKE directamente sobre ellas.

Obviamente, si se les ocurren soluciones mejores, soy todo oídos. Les agradezco de antemano cualquier información que me puedan brindar.

Última edición por RickJ; 18/10/2010 a las 02:50 Razón: Agregué una solución más

Etiquetas: find_in_set, performance, query
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 22:39.