Andreas Korthaus: temporäre Tabellen

Beitrag lesen

Hi Michael!

Bin jetzt nicht so sicher, aber ich habe das Gefühl, das wir ein wenig aneinander vorbei geredet haben. Ich habe das mit Der HEAP-Tabelle nur gemacht, um dei Daten irgendwie zum sortieren zwischenzuspeichern. Und das geht wirklich noch erheblich besser und schneller als ich gedacht hätte.
For allem dachte ich mir, spare ich mir so einen Plattenzugriff, daher HEAP. Das ist da immer nur eine Ergebnistabelle mit allen Feldern außer dem eigentlichen Postings, das hat der Fulltext ja bereits durchsucht und das kostet mit riesigem Abstand die meiste Performance. Also habe ich jetzt nur noch die restlichen Felder im RAM stehen, maximal 1000, die sortiere ich dann und lese sie aus. Da es eine Temporäre Tabell ist wird diese nach bveendigung der Verbindung aus dem RAM gelöscht, und es ergeben sich auch keine Überschneidungen.

Das geht superschnell! nie über 1/1000 Sekunde. Und ich gebe Dir vollkommen Recht, wenn jemand schlechte Begriffe eingibt, dann müssen nicht im Gegenzug alle anderen auf gute Performacne verzichten, so würde auf die falschen Leute zu viel Rücksicht genommen finde ich.

Das letzte Problem besteht jetzt eigentlich in dem Index-Cache, oder wie auch immer das Ding heißt. Wie gesagt, beim ersten mal über 20 Sekunden, beim 2. mal 10, beim 3. mal 4 und danach immer zw. 0,2 und 0,4. Aber die Suchbegriffe sind doch derart verschieden, dass am Ende die meisten Leute 4 Sekunden und mehr warten müssen, und der ganze Server entsprechen beansprucht würde. Und wenn man den mysqld mal neu startet gehts wieder von vorne los! Wenn ich mal bei webalizer gucke, da machen Such-Strings die 3 mal und weniger eingegeben wurden ca. 60-70% der gesamten Such-Anfragen aus(in einem Monat). Das hieße vermutlich am Ende eine Durchschnitts-Suchzeit von 5 oder mehr Sekunden! Das kann so doch nicht funktionieren!

Was meinst Du wie ich das verändern kann? Die Zeit geht bei

CREATE TEMPORARY TABLE temp_tabelle TYPE=HEAP
SELECT id,topic,title,name,time
FROM selfarchiv
WHERE
MATCH (topic,title,name,body) AGAINST ('Andreas') AND
MATCH (topic,title,name,body) AGAINST ('fsockopen()')
LIMIT 0, 1000

verloren, was aber genau so schnell/langsam ist, wie ohne CREATE

bei

SELECT * FROM temp_tabelle ORDER BY time DESC LIMIT 0, 100

dagegen dauert es wie gesagt imme unter 0,001 Sekunden.

Was könnte man hier machen? Ich denke das ist das letze Problem, selbst das instr() kostet fast nichst, vielleicht kann ich entweder in der ersten Suche, oder in der 2. noch mit regexp arbeiten, das geht ja in mysql(http://de.mysql.com/documentation/mysql/bychapter/manual.de_Regexp.html#Regexp
)

Grüße
Andreas