Hallo Michael!
Ich _hatte_ Deine Beiträge extra bevor ich mich nochmal damit auseinander gesetzt habe nochmal gelesen ;-)
Ok, keine Ahnung wieso es nicht ging, hab jetzt
nochmal ordentlich gefoltert und die Datenmenge
von über 50MB auf ca. 12 MB reduziert.
300.000 Datensätze mit Primary-Index, da dauert
die Suche unter 0,01 Sekunden.So viele Einträge brauchst Du gar nicht.
Ja, nur das filtern ist schwer, ich hatte halt gedacht damit verbinden zu können, dass worde die im Inex nicht vorkommen auch in der DB nicht vorkommen, aber das ist eh quatsch, da der Index nicht so aktuell sein würde.
Deshalb war mein Ansatz an dieses Problem, die Top 2% aller Suchbegriffe in diese Tabelle aufzunehmen und alles andere zu ignorieren.
Ja, hast Recht, so macht das erheblich mehr Sinn, da ist die Herangehensweise eines Informatikers doch besser ;-)
SELECT count FROM words WHERE word= 'a'
SELECT count FROM words WHERE word= 'b'
SELECT count FROM words WHERE word= 'c'Grusel. Das ist furchtbar langsam.
Nein, Du brauchst eine separate Tabelle aus nur noch zwei Spalten, nämlich dem Wort und seinen "Kosten".
Das habe ich bereits! Nur noch mit _allen_ Wörtern.
Ein "select count" sucht ja ggf. die gesamte Tabelle ab! Das sind intern tausende von Zugriffen.
Aber irgendwie _muss_ ich das doch machen?! Oder meinst Du das auf die vollst. Tabelle bezogen?
In der Tabelle stehen mnoch alle Wärter
vielfach drin, halt ime nur mit vielen
Zeichen drucm herum, halt "", (), '' $...
ich habe keine Ahnung wie ich das sinnvol
trennen kann,Verwende exakt die wordchar()-Funktion von mySQL.
Ich dachte Du meintest das:
"MySQL benutzt einen sehr einfachen Parser, um Text in Wörter zu zerlegen. Ein Wort'' ist jede Folge von Buchstaben, Zahlen, `'' und `\_'. Jedes
Wort'', das in der Liste der Stopwords vorkommt oder einfach nur zu kurz ist (3 Zeichen oder weniger), wird ignoriert."
Denn zu "wordchar finde ich nichts:
http://www.mysql.com/search/?q=wordchar
http://www.google.de/search?q=mysql+wordchar&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google-Suche&meta=
Problematischer gestaltet sich jetzt die weitere
Optimierung. Wenn was gsucht wird, was selten
ist, alles schön, aber sonst?Auch dazu hatte ich bereits gepostet: LIMIT mit interner Begrenzung und Meldung an den Anwender "Ihre Suche war zu ungenau spezifiziert und wurde deshalb nach <n> Treffern abgebrochen; bitte geben Sie weitere bzw. genauere Suchbegriffe ein".
Würdest Du dann an dieser Stelle abbrechen und keien Ergebnisse liefern, oder alles was bis dahin gefunden wurde? ersteres ist wohl besser _und_ performanter, oder? Wenn auch nicht viel.
Bei Google bekommst Du auch erst mal nur 10 Treffer zu sehen - und im Ernst, wen interessiert, wieviele Treffer es insgesamt sind?
Ja, aber da gibt es einen kleine aber feinen Unterrschied:
Google bewertet die Ergebnisse und liefert die besten zu erst! Und das kann nur funktionieren wenn Du einmal _alles_ durchsucht hast! Ich denke mal das Googel den Speed weniger über dei Datenbank holt, klar, aber die sind auch irgendwann ausgereitzt, sondern vielmehr über eine geniale cache-Technik.
Und ich bin noch bei heap geblieben, da ich
nicht weiß, wie ich eien _tenporäre_ MyISAM
Tabelle auf einer RAMdisk speichern kann.Indem Du eine RAM-Disk installierst und auf den Pfad mountest, wo mySQL seine temporären Tabellen speichert - auch dazu hatte ich bereits gepostet.
Ja, hast recht, ich hatte das etwas anders in Erinnerung, sorry.
Außerdem müßte ich noch die Posting_ID zu jedem
Datensatz speichern, was bei 12 Mio Datensätzen
das Volumen der Tabelle auf über 1 GB heben
dürfte.Kann durchaus sein - macht aber gar nichts, weil die Suche immer nur auf einen möglichst keinen Teil dieser Daten zugreifen wird. _Deshalb_ sind die doch ein sortierter Baum ...
Aber nur bei Verwendung des Fulltext-Index, oder? Das ist ja gerade der entscheindende Unterschied wobei ich nicht verstehen kann das bei 150.000 Datensätzen und 105 MB Daten und 110 MB Fulltext Index die Suche 1 Minute Dauern kann, das verstehe ich nicht. Da ist das Suchen in der Tabelle mit 12 Mio DS die linear durchsucht werden sogar schneller!!!
Viele Grüße
Andreas