Comment créer des entrées multiples sur l'indice en fonction des champs d'une rangée?
-
16-10-2019 - |
Question
Je ne trouve un bon moyen d'indexer plusieurs champs d'une ligne sous forme d'entrées d'un index ou simulent cette fonction MySQL.
Le problème se pose lorsque vous avez des champs de travail en tant que balises ou concept similaire. Ex .: champs noms comme balise1, tag2, tag3. Pour rechercher des lignes avec une étiquette spécifique nécessite rapide que vous avez 3 index et faire 3 requêtes distinctes sur la façon la plus simple et évidente.
Est-il possible d'indexer ces 3 champs comme les entrées d'un index permettant une seule recherche.
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
Ou est-il une autre façon de le faire efficacement?
La solution
Si je comprends bien, cette requête devrait fonctionner:
SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;
Compte tenu de cette structure de la table:
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 |
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
Autres conseils
Chaque fois que vous avez un nom de champ numéroté, vous n'avez pas normalisé vos tables. Je probablement à la place d'une table « tag », que je pourrais alors rejoindre à tout ce que je marquage:
ID tag
-- ---
01 abc
01 xyz
01 bla
02 foo
02 bar
02 ble
03 xyz
03 bla
03 bar
(avec la clé primaire étant multi-colonne, et qu'il y ait un indice supplémentaire sur celui qui est le second champ dans l'index multi-colonnes)
Vous pouvez toujours ajouter une colonne « ordre » s'il est nécessaire que les étiquettes soient dans un ordre spécifique.