Hallo,
hätte mal eine Frage an die Datenbankspezialisten an dieser Stelle. Ich arbeite gerade an einem neuen Kleinanzeigenmarkt. Wir rechnen, mit durchschnittlich 2 Millionen aktiven Anzeigen. Anfangs hatten wir auf die verschiedenen Rubriken runtergebrochen mehrere Tabellen, in denen die jeweiligen Anzeigen stehen, der Anzeigentext ist ausgelagert, ebenso div. Merkmale (z.B. Servolenkung, Klimaanlage bei Autos). Aus dem Anzeigentext werden Keywords (die wiederum in einer Keyword-KeywordID Tabelle ausgelagert sind) erzeugt, zusätzlich gibt es eine Features Tabelle (in der z.B. festgelegt wird, ob diverse kostenpflichtige Zusatzoptionen gebucht wurden), die wiederum alle zusammengejoint werden.
Somit ergeben sich relativ komplete SQL Statements, z.B.
SELECT a.anzeigenid, a.rubrikid, a.titel, a.sicht, a.preis, a.preisArt, a.erscheinungsdatum, a.plz AS anzeigePlz, a.status, features.fett, features.highlighted FROM anzeigen.sort_erscheinungsdatum_desc s, anzeigen.alle a LEFT JOIN anzeigen_features f ON a.anzeigenid=f.anzeigenid, mp_suchindex.keywords_10 AS k1,
mp_suchindex.keywords_10 AS k1,
merkmale_global.haarfarbe,
merkmale_global.augenfarbe,
merkmale_global.groesse
WHERE a.anzeigenid=s.anzeigenid AND a.rubrikid IN (16)
AND a.status='aktiv' AND a.erscheinungsdatum <= now()
AND a.anzeigenid=merkmale_global.haarfarbe.anzeigenid AND merkmale_global.haarfarbe.wert='rot'
AND a.anzeigenid=merkmale_global.augenfarbe.anzeigenid AND merkmale_global.augenfarbe.wert='gruen'
AND a.anzeigenid=merkmale_global.groesse.anzeigenid AND merkmale_global.groesse.wert>'180'
AND a.anzeigenid=k1.anzeigenid AND k1.keyword='99217'
AND a.anzeigenid=k2.anzeigenid AND k2.keyword='99323'
ORDER BY erscheinungsdatum desc
LIMIT 0,50
Diese Suchanfrage findet in der Rubrik Kontakte Sie sucht Ihn alle rothaarigen, grünäugigen Damen bis 180 cm Größe, die das Keyword 99217 (finanziell) und das Keyword 99323 (unabhängig) besitzen.
Im Statement wird 2x mit verschiedenen Aliases auf die Keywordtabelle mit Keywords mit 10 Zeichen gejoint.
Momentan ist das ganze eigentlich relativ performant, die Frage, ist, was kann man tun, um es noch performanter zu bekommen?!
Ein Ansatz, den ich verfolgt habe, wäre das ORDER BY rauszunehmen, über einen CronJob eine weitere sortierte Tabelle mitaufzunehmen, so dass die Ergebnisse hier "vorsotiert" werden.
Was fallen euch hier für Möglichkeiten ein? Wie machen es die großen wie z.B. Ebay?
Danke für eure Hilfe.
Joah.