phpbar.de logo

Mailinglisten-Archive

AW: Abfrage verschnellern

AW: Abfrage verschnellern

Andreas Müller mysql at universalware.de
Die Jul 15 16:48:37 CEST 2003


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