Hallo!
Ich teste ja zur Zeit mit dem Selfforum-Archiv (http://selfarchiv.knet-systems.de/, aber nicht immer verfügbar).
Das Problem ist, das das ganze bei größeren Sortiervorgängen unglaublich langsam wird. Vor allem ein ORDER BY time 10-20facht die Such-Zeit, und das wird auch nicht gecached.
Daher hatte ich mir überlegt, ich schreibe das Ergebnis, welches ich mit der FULLTEXT-Suche gefunden habe in eine temporäre Tabelle mit begrenzter Datensatz-Anzahl.
Jetzt stellt sich die Frage welches Tabellenformat ich hierfür verwende. Das beste sollen wohl HEAP-Tabellen sein, da die direkt im Arbsitspeicher geladen werden, udn daher extrem schnell sein sollen. 2. Frage ist, welche Daten alle in der temporären Tabelle stehen müssen. Am besten schreibt man doch alle gefunden Daten in die temporäre Tabelle, um dei Datenn direktsortert ausgeben zu können, oder sollte man nur die IDs in die Tabelle schreiben und auf die "feste" Tabelle joinen? Aber dabei ergeben sich Probleme:
1. welchen Namen verwende ich für die temporäere Tabelle? So wie ich das verstanden habe, sind die Temporären Tabellen, so lange existent, für alle Clients "gültig". Das heißt wenn cihd ei Tabelle "temp_table" nenne, kann es bei gleicheitigen Zugriffen auf das Script welches die temp-Tabelle erzeugt zu Konflikten kommen.
2. Mir geht es vor allem auch um ORDER BY, und das kann HEAP nicht, oder? Komme ich dann um MyISAM nicht herum?
Mich stört hier folgender Satz aus der Doku:
Sie können nicht nach dem nächsten Eintrag in der Reihenfolge suchen (also den Index benutzen, um ein ORDER BY zu machen).
http://de.mysql.com/documentation/mysql/bychapter/manual.de_Table_types.html#HEAP
Hier mal eine beispielhafte Anfrage:
SELECT id,topic,title,name,time
FROM selfarchiv
WHERE
MATCH (topic,title,name,body) AGAINST ('Datenbank') AND
MATCH (topic,title,name,body) AGAINST ('MySQL')
LIMIT 0, 100;
Das funktioniert sehr schnell, wenn das ganze erstmal im Cache ist.
SELECT id,topic,title,name,time
FROM selfarchiv
WHERE
MATCH (topic,title,name,body) AGAINST ('Datenbank') AND
MATCH (topic,title,name,body) AGAINST ('MySQL')
ORDER BY time DESC
LIMIT 0, 100;
das dauert immer tierisch lange, egal was ich mache. Daher hatte ich mir das ungefähr so überlegt:
CREATE TEMPORARY temp_tabelle (
id smallint(6),
topic varchar(20),
title varchar(100),
name varchar(40),
time int(10),
PRIMARY KEY (id)
TYPE=HEAP;
)
INSERT INTO temp_tabelle (id,topic,title,name,time)
SELECT id,topic,title,name,time
FROM selfarchiv
WHERE
MATCH (topic,title,name,body) AGAINST ('Datenbank') AND
MATCH (topic,title,name,body) AGAINST ('MySQL');
SELECT id,topic,title,name,time
FROM temp_tabelle
ORDER BY time DESC;
So hatte ich mir das in etwas gedacht. Oder wäre es besser die unsortierten Daten direkt auszulesen, ohne Temporäre Tabelle und ORDER BY, das ganze in einen Array schreiben und den sortieren? Was ist von wegen Länge der Temporären Tabelle zu beachten? Sollte ich das mit einem Limit bschränken, oder ist es egal wenn da einige 1000 Tabellen drin stehen, denn nur wenn ich alle Datensätze habe kann ich auch korrekt sortieren, ohne das evtl. relevante Ergebnisse unter den Tisch fallen?
Viele Grüße
Andreas