Domanda

Non ho mai trovato un buon modo per indicizzare più campi di una riga come voci di un indice o di simulare questa funzione MySQL.

Il problema sorge quando si dispone di campi di lavoro come tag o concetto simile. Es .: campi nomi come tag1, tag2, tag3. Per cercare linee con un tag specifico richiede veloce che avete 3 indice e fare 3 query separate in modo più semplice ed evidente.

C'è un modo per indicizzare questi 3 campi come le voci di un indice che consente una sola ricerca.

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 c'è qualche altro modo per fare questo in modo efficace?

È stato utile?

Soluzione

Se ho la comprensione correttamente, questa query dovrebbe funzionare:

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

Data questa struttura della tabella:

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 |
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+

Altri suggerimenti

Ogni volta che hai un nome di campo numerato, hai non normalizzato le tabelle. Avrei probabilmente invece una tabella 'tag', che ho potuto poi unirsi a tutto ciò che sto codifica:

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

(con la chiave primaria essendo più colonne, e che vi sia un indice aggiuntivo sulla seconda di quale sia il secondo campo nell'indice più colonne)

Si può sempre aggiungere una colonna 'ordine', se è necessario che i tag siano in un ordine specifico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top