Lar337 schrieb:
Sowohl die Suchbegriffe "Berlin", "Kreuzberg" als auch "Berlin Kreuzberg" würden das Ergebnis "Berlin Kreuzberg" treffen.
Und was ist mit "Berlin, Kreuzberg"? Oder "Kreuzberg Berlin"?
Fulltext search in MySql/MariaDB benötigt einen Fulltext Index und "match () against ()".
Dein Beispiel aus Post #5 ist übrigens auch sehr schlecht, weil es auf das (temporäre) Feld in der Where-Bedingung keinen Index nutzen kann.
Wenn dann
SQL:
WHERE stadtteil.name = 'Kreuzberg'
AND stadt.name = 'Berlin';
[edit]
Welche Methode mal wählt ist immer fallabhängig. Wenn man in der linken Tabelle schon auf wenige selektieren kann (sprich die where schliesst da schon viel aus) ist ein Join das Richtige. (Ein Join auf eine Tabelle mit Millionen Einträgen, nur um in der rechten Tabelle dann 10 zu selektieren ist perf.tech ein richtiger Spaß)
Wenn man aber eher in der rechten Tabelle selektiert (und man sicher stellen kann, dass die rechte Tabelle nicht zu viele results hat) ist z.B. eher ein IN (subquery) sinnvoll. Der Knackpunkt hier ist, dass mySql keine table-übergreifenden Indexe nutzen kann, also versucht man zuerst die Tabelle zu wählen die am meisten vom Index profitiert und/oder am wenigsten Treffer liefert. Hier kann aber auch die Reihenfolge vom Join entscheidend sein, also statt IN einfach rechts und links vertauschen, kann auch schon viel bringen.
dreivier schrieb:
EDIT: Ich überlege gerade, ob das am Fulltext Index liegen könnte?
Funktioniert halt nicht mit LIKE.
Mysql ist bei richtigem fulltext search eh etwas suboptimal. Wenn man das viel machen muss, hilft eine search engine. Aber das ist hier dann wohl doch eher die Kanone^^
Lar337 schrieb:
Dass dies aus Performancegründen trotzdem keine gute Lösung ist, habe ich ja gesagt.
Ja, vor allem wegen dem leading %.
dreivier schrieb:
name, stadtteil, stadtteilinfo haben fulltext index
FT sparsam einsetzen. Nur dort, wo es wirklich sinnvoll ist. Und hier im Thread sehe ich keinen Nutzen.
FT ist dann sinnvoll, wenn in Dokumenten/Texten gesucht werden muss. Hier würde ich mich eher auf klassische B-Tree-Indexe verlassen und mit "= 'x'" oder "LIKE 'x%'" suchen. MySql kann auch keine FT-Indexe verknüpfen!