phpbar.de logo

Mailinglisten-Archive

[dbs] Abfrageoptimierung

[dbs] Abfrageoptimierung

Sven phpbar at koalashome.de
Son Okt 26 23:05:13 CET 2003


Hallo

Ich habe eine Abfrage, die je mehr Ergebnisse sie liefert, weit mehr als 4 
Sekunden dauern kann. Das muss doch irgendwie zu optimieren sein.
Mir fällt allerdings nichts mehr dazu ein.

Hier die Abfrage:
SELECT kfz_firmen.f_id, kfz_firmen.firma, kfz_firmen.strasse, kfz_firmen.plz, 
       kfz_firmen.ort, kfz_firmen.accountart, kfz_firmen.akin
FROM kfz_firmen, kfz_automarke, kfz_region, kfz_service
LEFT JOIN kfz_zu_af ON ( 
    kfz_firmen.f_id = kfz_zu_af.f_id AND kfz_automarke.a_id = kfz_zu_af.a_id)
LEFT JOIN kfz_zu_rf ON ( 
    kfz_firmen.f_id = kfz_zu_rf.f_id AND kfz_region.r_id = kfz_zu_rf.r_id ) 
LEFT JOIN kfz_zu_sf ON ( 
    kfz_firmen.f_id = kfz_zu_sf.f_id AND kfz_service.s_id = kfz_zu_sf.s_id ) 
WHERE kfz_firmen.akin = '1' AND kfz_automarke.akin = '1' AND 
      kfz_region.akin = '1' AND kfz_service.akin = '1' AND 
      kfz_service.s_id = '25' AND kfz_zu_sf.s_id = '25'
GROUP BY kfz_firmen.firma, kfz_firmen.strasse
ORDER BY kfz_firmen.accountart, kfz_firmen.firma
LIMIT 0 , 10 

Anmerkungen dazu:
Es gibt 4 Tabellen mit Hauptinhalten, wobei sich alles auf die Tabelle 
"kfz_firmen" bezieht.
3 Tabellen (kfz_zu_af, kfz_zu_rf, kfz_zu_sf) beinhalten die Verknüpfungen der 
Tabellen kfz_automarke, kfz_region und kfz_service mit der Tabelle 
kfz_firmen.
Die Verknüpfungstabellen sehen so aus (Beispiel kfz_zu_af):
af_id | a_id | f_id
af_id - Primary
a_id - Index
f_id - Index

Die akin-Spalten sind vom Typ "enum" und beinhalten nur 1 oder 0.

So, und dann hab ich zu dieser Abfrage noch eine EXPLAIN-Ausgabe (Erzeugt mit 
phpMyAdmin):

+---------------+-------+---------------+---------+---------+
| table         | type  | possible_keys | key     | key_len |
+---------------+-------+---------------+---------+---------+
| kfz_service   | const | PRIMARY,akin  | PRIMARY |       4 |
| kfz_firmen    | range | akin          | akin    |       1 |
| kfz_automarke | ALL   | akin          | NULL    |    NULL |
| kfz_zu_af     | ref   | a_id,f_id     | a_id    |       4 |
| kfz_region    | ALL   | akin          | NULL    |    NULL |
| kfz_zu_rf     | ALL   | f_id,r_id     | NULL    |    NULL |
| kfz_zu_sf     | ref   | f_id,s_id     | f_id    |       4 |
+---------------+-------+---------------+---------+---------+

+---------------+-------------------+------+--------------------------------+
| table         | ref               | rows | Extra                          |
+---------------+-------------------+------+--------------------------------+
| kfz_service   | const             |    1 | Using temporary; Using filesort|
| kfz_firmen    | NULL              |  132 | Using where                    |
| kfz_automarke | NULL              |   24 | Using where                    |
| kfz_zu_af     | kfz_automarke.a_id|   12 |                                |
| kfz_region    | NULL              |   30 | Using where                    |
| kfz_zu_rf     | NULL              |   25 |                                |
| kfz_zu_sf     | kfz_firmen.f_id   |   12 | Using where                    |
+---------------+-------------------+------+--------------------------------+

Wo kann man hier mit einer Optimierung ansetzen?

-- 
Koala


php::bar PHP Wiki   -   Listenarchive