Hallo allerseits,
weiß nicht, ob hier viele Leute mit mySQL arbeiten. Vielleicht ist es auch halbwegs egal, welche DB dahintersteht.
Im Grunde geht es um eine Tabelle mit mehreren hunderttausend Artikeln, die mit einer Volltextsuche über mehrere Spalte durchsucht werden sollen. Jetzt läuft das ganze erwartungsgemäßg nichteinmal annähernd in Echtzeit und ich würde gerne noch ein bißchen Performance rausholen.
Das mySQL-Handbuch ist in der Hinsicht nicht aufschlußreich. Beim MS SQL-Server würde ich die Performance über die diversen Überwachungstools checken und dann versuchen, die Indizes und die SQL-Abfrage anzupassen. Wie macht man sowas mit mySQL?
Danke schonmal!
Christian
Weeks of programming can save you hours of planning
das MySQL-Handbuch ist da doch halbwegs ausführlich. Wenn du bisher mit selbsterstellem Standard-SQL (" like '%xyz%'") arbeitest, würd ich mir den MATCH-Befehl von MySQL mal anschauen.
http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-language.html
Danke für die schnellen Antworten.
Die Stoppwort-Liste würde ich erstmal außer Acht lassen (müssen), da ich darauf momentan keinen Zugriff habe.
Momentan führe ich die Abfrage im "Boolean Mode" aus. Das ist ja relativ gut dokumentiert, allerdings nicht was die Performance-Optimierung betrifft...
Ich durchsuche drei Felder (Titel, Beschreibung und Bildunterschrift), die jeweils anders gewichtet werden sollen. Einen Volltext-Index gibt es, der über alle drei Felder angelegt wurde. Das Suchergebnis soll dann nach Relevanz sortiert werden.
Ich weiß nicht so recht, wo ich anfange, zu optimieren. Eh ich einfach wild rumprobiere, wollte ich mal nach euren Erfahrungen fragen.
Mir fällt erstmal folgendes ein:
Wie geht man da am besten vor, um die optimale Performance zu erreichen, bzw. welche Möglichkeiten hat man überhaupt?
Danke nochmal!
Christian
Weeks of programming can save you hours of planning
Gibt es eigentlich auch eine Möglichkeit "ähnliche" Wort zu finden? So daß bspw. auch Artikel mit dem Namen "Renault 19" gefunden werden, wenn der Benutzer "Renault19" eingibt. Bzw. umgekehrt... Ist sowas machbar?
Weeks of programming can save you hours of planning
Aktueller Stand:
Hab jetzt erstmal eine Volltextsuche im Boolean-Mode implementiert, die halbwegs performant läuft. Der Boolean-Mode scheint jedenfalls wesentlich schneller zu sein.
Sehr langsam wird es allerdings, wenn man die Ergebnisse am Ende der Liste anzeigen möchte, also der Offset-Wert fürs LIMIT sehr hoch ist.
Ein weiteres Problem ist nach wie vor, daß man nur mit hohem Aufwand feststellen kann, wieviele Suchergebnisse überhaut gefunden wurden. Dadurch kann man bspw. keine Funktion anbieten, um zum Ende der Liste zu Navigieren. Das wird auch der Grund sein, daß soetwas bei Google auch nicht existiert.
Es gibt auch einige Erweiterungen für mySQL, die eine performante Volltextsuche (mit Ähnlichkeit, Stemming etc.) zur Verfügung stellen, z.B. Sphinx.
Hat jemand mit soetwas schon Erfahrungen gemacht?
Schöne Grüße,
Christian
Weeks of programming can save you hours of planning