Fulltext-Index über mehrere Spalten vs. über jede Spalte separat

Fulltext-Index über mehrere Spalten vs. über jede Spalte separat

am 26.09.2006 17:04:12 von Markus Ernst

Hallo

Diese Tabelle enthält die Inhalte jeder Seite für die interne Site-Suche:

CREATE TABLE `suche` (
`seiten_id` int(10) unsigned NOT NULL default '0',
`sprache` varchar(3) NOT NULL default '',
`head` tinytext NOT NULL,
`inhalt` text NOT NULL,
PRIMARY KEY (`seiten_id`,`sprache`),
KEY `sprache` (`sprache`),
FULLTEXT KEY `head` (`head`),
FULLTEXT KEY `inhalt` (`inhalt`),
FULLTEXT KEY `head, inhalt` (`head`,`inhalt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Die Inhalte sind in zwei verschiedenen Feldern abgelegt:
- "head" mit den wichtigsten Informationen wie Titel usw.; Treffer aus
diesem Feld werden dann stärker gewichtet
- "inhalt" mit dem Rest des Inhalts

Die Abfrage lautet dann beispielsweise:

SELECT seiten_id FROM suche
WHERE sprache='de'
AND MATCH (head, inhalt) AGAINST ('suchphrase' IN BOOLEAN MODE)
ORDER BY (
((MATCH (head) AGAINST ('suchphrase' IN BOOLEAN MODE)) * 5)
+ MATCH (inhalt) AGAINST ('suchphrase' IN BOOLEAN MODE)
) DESC";

Da ich für die eigentliche Suche "head" und "inhalt" zusammen abfrage,
für die Sortierung aber separat, habe ich je einen Fulltext-Index für
jedes Feld und einen für beide zusammen angelegt. Nun meldet phpMyAdmin:

"Es sollte nicht mehr als ein Index des Typs FULLTEXT für die Spalte
`head` gesetzt sein"

Der langen Rede kurze Frage: Ist es sinnvoller, den Fulltext-Index für
beide Spalten zu entfernen, oder denjenigen für "head"?

Danke für eine Einschätzung!
Markus

Re: Fulltext-Index über mehrere Spalten vs. über jede Spalte separat

am 26.09.2006 19:11:38 von Axel Schwenke

Markus Ernst wrote:
>
> CREATE TABLE `suche` (
....
> FULLTEXT KEY `head` (`head`),
> FULLTEXT KEY `inhalt` (`inhalt`),
> FULLTEXT KEY `head, inhalt` (`head`,`inhalt`)
> )
....

> Nun meldet phpMyAdmin:
>
> "Es sollte nicht mehr als ein Index des Typs FULLTEXT für die Spalte
> `head` gesetzt sein"
>
> Der langen Rede kurze Frage: Ist es sinnvoller, den Fulltext-Index für
> beide Spalten zu entfernen, oder denjenigen für "head"?

Weder, noch.

phpMyAdmin ist (mal wieder) kaputt. Für gewöhnliche (B-Tree) Indexe
stimmt zwar, daß man mit jedem zusammengesetzten Index auch Indexe auf
alle Prefixe dieses Index erhält. Für FULLTEXT Indexe gilt das hingegen
nicht, weil da ein Index über mehrere Spalten in Wirklichkeit in Index
über die Konkatenation dieser Spalten ist.

Also einfach ignorieren und doe phpMyAdmin Leute treten, daß sie die
nötige Sonderbehandlung für Fulltext-Indexe nachlegen.


XL

Re: Fulltext-Index über mehrere Spalten vs. über jede Spalte separat

am 27.09.2006 09:59:00 von Markus Ernst

Axel Schwenke schrieb:
[...]
>
> phpMyAdmin ist (mal wieder) kaputt. Für gewöhnliche (B-Tree) Indexe
> stimmt zwar, daß man mit jedem zusammengesetzten Index auch Indexe auf
> alle Prefixe dieses Index erhält. Für FULLTEXT Indexe gilt das hingegen
> nicht, weil da ein Index über mehrere Spalten in Wirklichkeit in Index
> über die Konkatenation dieser Spalten ist.
>
> Also einfach ignorieren und doe phpMyAdmin Leute treten, daß sie die
> nötige Sonderbehandlung für Fulltext-Indexe nachlegen.

Vielen Dank für diese Hintergrundinfos!

Unterdessen habe ich noch ein paar Tests gemacht und festgestellt, dass
die WHERE-Klausel mit separaten MATCHes auf die einzelnen Spalten etwa
gleich schnell ist wie die mit dem kombinierten Index (zumindest bei
meinem Datenbestand mit ca. 2000 Datensätzen). Wahrscheinlich weil dann
die MATCHes in der WHERE- und der ORDER-Klausel identisch sind. So kann
ich auf den kombinierten Index grad verzichten und etwas Plattenplatz
sparen :-).

Gruss
Markus