Come creare più voci su indice in base ai campi di una riga?
-
16-10-2019 - |
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?
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.