Mailinglisten-Archive |
Hallo zusammen, also mit dem Datenmodell befürchte ich mal da kann man icht mehr viel herausholen. Viel besser wäre es eine kleine Normierung durchzuführen und eine weitere Tabelle hinzuzufügen: tblItemCat ---------- - itNum (PrimaryKey) tblCats ------- - catChild (PrimaryKey) tblItemCatsRel -------------- - itNum - catChild Auf Deutsch: Statt einen Datensatz in tblItemCat mittels 2 Feldern einer Cat. zuzuordnen verwendet man besser eine 1:n Beziehung. Diese sorgt nicht nur für ein saubereres normiertes Datenmodell sondern auch dafür das es viel einfacher join-bar ist wie dann z.B. so: select distinct(a.itNum) from tblItemCat a inner join tblItemCatsRel b on b.itNum=a.itNum inner join tblCats c on c.catChild=b.catChild and c.catParent=9719 where a.itLand in (1,4,6,9,0) Entsprechende Indizes vorausgesetzt deren zusammensetzung man leicht an der Join-Bedingungen ablesen kann sollte die Abfrage wesentlich beschleunigen. Was lernen wir daraus: OR-Bedingungen lassen sich extrem schlecht optimieren. Bei OR-Bedingungen auf "gleiche" Daten ist oft eine (wie ich es immer nenne) Mappingtabelle sinnvoll. Wenn das OR nicht zu entfernen ist dann sollte man es optimizerfreundlicher schreiben aus: "B.catParent = 9719 and (A.itCategory = B.catChild or A.it2ndCat = B.catChild)" wird dann "(B.catParent = 9719 and A.itCategory = B.catChild) or (B.catParent = 9719 and A.it2ndCat = B.catChild) Informatikstudenten werden sich evtl. den Bereich "Logik" in der Mathematik erinnern *smile* Ebenso schlecht optimierbar ist die letzte Bedingung "in (1,4,6,9,0)". Hier kenne ich den Hintergrund nicht aber wenn das noch wegoptimierbar wäre sollte solch eine Abfrage im Bereich unter 1 Sekunde liegen. Gruß, Andreas aka TheOptimizer :-) -- Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter -->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive