Pregunta

Nunca encontró una manera buena para indexar múltiples campos de una fila como entradas de un índice o simular esta función en MySQL.

El problema surge cuando se tiene campos de trabajo como etiquetas o concepto similar. Ej .: nombres de campos como la etiqueta 1, etiqueta 2, etiqueta 3. Para buscar líneas con una etiqueta específica rápido requiere que tenga 3 índice y hace 3 consultas separadas en la forma más básica y obvia.

¿Hay alguna forma de índice de estos 3 campos como entradas de un índice que permite una sola búsqueda.

ID tag1 tag2 tag3
-- ---- ---- ----
01 abc  xyz  bla
02 foo  bar  ble
03 xyz  bla  bar

index
abc -> 01
bar -> 02 03
bla -> 01 03
ble -> 02
foo -> 02
xyz -> 01 03

O hay alguna otra manera de hacer esto de manera eficiente?

¿Fue útil?

Solución

Si yo estoy entendiendo correctamente, esta consulta debería funcionar:

SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;

Dada esta estructura de la tabla:

CREATE TABLE `testTag` (
  `id` int(11) NOT NULL,
  `tag1` varchar(10) DEFAULT NULL,
  `tag2` varchar(10) DEFAULT NULL,
  `tag3` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `tags` (`tag1`,`tag2`,`tag3`)
) ENGINE=InnoDB

mysql> EXPLAIN SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table   | type  | possible_keys | key  | key_len | ref  | rows |     Extra                    |    
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | testTag | index | NULL          | tags | 39      | NULL |   15 | Using where; Using index |
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+

Otros consejos

Cada vez que tienes un nombre de campo numerado, has no normalizó sus tablas. Me probable lugar una tabla 'etiqueta', que luego podría unirse a lo que estoy etiquetado:

ID tag
-- ---
01 abc
01 xyz
01 bla
02 foo
02 bar
02 ble
03 xyz
03 bla
03 bar

(con la clave primaria de ser multi-columna, y no habiendo un índice adicional sobre lo que es el segundo campo en el índice de varias columnas)

Siempre se puede añadir una columna de 'orden' si es necesario que las etiquetas estén en un orden específico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top