Comment créer des entrées multiples sur l'indice en fonction des champs d'une rangée?

dba.stackexchange https://dba.stackexchange.com/questions/186

  •  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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top