Frage

Ich habe nie einen guten Weg gefunden, um mehrere Felder einer Zeile als Einträge eines Index zu indizieren oder diese Funktion auf MySQL zu simulieren.

Das Problem tritt auf, wenn Felder als Tags oder ein ähnliches Konzept arbeiten. Bsp.: Fields Namen als Tag1, Tag2, Tag3. Um Zeilen mit einem bestimmten Tag schnell zu suchen, müssen Sie 3 Index haben und 3 separate Abfragen auf die grundlegendste und offensichtlichste Weise durchführen.

Gibt es eine Möglichkeit, diese 3 Felder als Einträge eines Index zu indizieren, der nur eine Suche ermöglicht?

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

Oder gibt es eine andere Möglichkeit, dies effizient zu tun?

War es hilfreich?

Lösung

Wenn ich richtig verstehe, sollte diese Abfrage funktionieren:

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

Angesichts dieser Tabellenstruktur:

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

Andere Tipps

Jedes Mal, wenn Sie einen nummerierten Feldnamen haben, haben Sie Ihre Tabellen nicht normalisiert. Ich hätte wahrscheinlich stattdessen eine "Tag" -Tabelle, die ich dann mit allem zusammenschließen könnte, was ich markiert habe:

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

(Der Primärschlüssel ist ein Multi-Säulen-Bereich, und es gibt einen zusätzlichen Index, auf dem das zweite Feld im Mehrspalben-Index ist.)

Sie können jederzeit eine "Bestell" -Spalte hinzufügen, wenn die Tags in einer bestimmten Reihenfolge erforderlich sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top