SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 26.07.2005, 14:35:07
henning666 henning666 ist offline
Anfänger
 
Registriert seit: Jul 2005
Beiträge: 12
Optimierung bei INNER JOIN mit großen Tabellen

Hallo,

ich habe hier ne Kunden-Tabelle mit ca. 40000 Einträgen und eine PLZ-Tabelle (vollständig, ebenfalls ca. 40000 Einträge).

Wenn man im Frontend nach Kunden in einem bestimmten Ort sucht z.B. Neustadt, und dieser Ort mehrmals innerhalb des Bundesgebietes zu finden ist z.B. Neustadt, dann wird dem User eine Select-Box angeboten in der alle Neustadts mit Landkreis und Bundesland angegeben ist. Wählt er z.B. Neustadt am Rbge. suche ich danach in der PLZ Tabelle nach allen PLZ die zu Neustadt am Rbge gehören und stelle daraus einen Query zusammen, den ich gegen die Kunden-Tabelle laufen lasse.

Query:
Code:
SELECT * FROM kunden WHERE (plz=12345 OR plz=23456 ... OR plz=34567).
Soweit so schlecht.

Sucht der User jetzt z.B. nach München (blöderweise gibt´s München und den Flughafen München Freising) wird der Query ewig lang (in Open-Office über 2 Seiten) also Query anders:
Code:
SELECT * FROM kunden AS a INNER JOIN plz_all AS b USING (plz) WHERE b.ort = 'München' AND b.kreis = 'Kreisfreie Stadt' AND b.bundesland_id = '3' LIMIT 0, 20
Super Zugriffszeit von 0,9 Sek. - alles Klar.
Von wegen:

Will der User die Datensätze umsortieren z.B. nach plz
Code:
SELECT * FROM kunden AS a INNER JOIN plz_all AS b USING (plz) WHERE b.ort = 'München' AND b.kreis = 'Kreisfreie Stadt' AND b.bundesland_id = '3' ORDER BY a.plz DESC LIMIT 0, 20
Zugriffszeit > 70 Sek = Essig.
Da ist der ewig lange Query um einiges schneller.

Hat hier jemand eine Idee??

Vielen Dank für jeden Hinweis

Henning
Mit Zitat antworten
  #2  
Alt 26.07.2005, 17:15:56
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Optimierung bei INNER JOIN mit großen Tabellen

Hi Henning,

ich gehe mal davon aus, daß Du einen sauberen Index auf a.plz UND b.plz hast. Falls nicht: Unbedingt machen.

Weiterhin ist ein SELECT * nicht die feine Art, besser ist es hier, jede Spalte einzeln aufzuführen.

Bzgl. Performance weiß ich nicht, ob das USING nicht etwas mehr kostet als ein SELECT ... ON a.plz = b.plz, eventuell auch mal an der Schraube drehen.

Schau in jedem Fall auch mal, was ein EXPLAIN SELECT ausgibt. Eventuell siehst Du daran, wenn ein Index nicht sauber verwendet werden konnte.

HTH,

Andy
Mit Zitat antworten
  #3  
Alt 26.07.2005, 18:04:33
henning666 henning666 ist offline
Anfänger
 
Registriert seit: Jul 2005
Beiträge: 12
AW: Optimierung bei INNER JOIN mit großen Tabellen

Vielen Dank für Deine Antwort.

Ich habe bei beiden Tabellen den Index wie Empfohlen angelegt und der Query sieht jetzt so aus:

Code:
SELECT DISTINCT a.id, a.vorname, a.name, a.strasse, a.plz, a.ort, a.tel, a.bild FROM kunden AS a INNER JOIN plz_all AS b ON a.ort=b.ort WHERE b.ort = 'München' AND b.kreis = 'Kreisfreie Stadt' AND b.bundesland_id = '3' ORDER BY a.plz LIMIT 0, 20
Erklärung dazu:

table...type...possible_keys.key.key_len.ref....rows........extra
a........ref.....ort...........ort.....100.const...454...Using where; Using temporary; Using filesort
b........ref.....ort...........ort.....100.b.ort.....7

Damit kann ich leider gar nix anfangen :-(
(Wahscheinlich auch niemand anders, aber ich hab jetzt Feierabend ;-) )

Jedenfalls gab es leider keinen Performance Gewinn *schnüff*
(Allerdings läuft der ursprüngliche Query jetzt in 7 Sekunden durch *kopfkratz*, der Server war wohl noch nicht ganz wach, gestern zu lange in der Kneipe gewesen oder so ;-) )

Falls es noch weitere Ideen gibt...

Henning

p.s. kannn man in diesem Forum irgendwie HTML Tabellen darstellen??
Mit Zitat antworten
  #4  
Alt 27.07.2005, 09:13:27
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Optimierung bei INNER JOIN mit großen Tabellen

Hi Henning,

was mir als erstes auffällt ist, daß Du jetzt auf einmal mit "ort" JOINst und nicht mehr mit "plz".
Zweitens hast Du jetzt ein DISTINCT drin, was vorher nicht da stand.

Laut deinem EXPLAIN wird der Index "ort" verwendet, was bei diesem JOIN korrekt ist und auch nicht schlecht aussieht.

Setzte auf die Spalten "plz" und "ort" jeweils einen Index, damit hast Du einen Index für den JOIN und einen für den ORDER BY, so daß hier ein Performance Gewinn da sein sollte.

HTH,

Andy
Mit Zitat antworten
  #5  
Alt 27.07.2005, 10:55:35
henning666 henning666 ist offline
Anfänger
 
Registriert seit: Jul 2005
Beiträge: 12
AW: Optimierung bei INNER JOIN mit großen Tabellen

Hi Andy,

stimmt, wo kommt denn bloss der Ort-Join her?

Nach änderung in Plz - Zugriffszeit > 0,1 Sek.

Als noch Ort drin war bekam ich ohne Distinct nur 2 Datensätze die sich ständig wiederholten *???* mit Plz geht´s auch ohne.

Super vielen Dank

da wird Cheffe sich aber freuen

Henning
Mit Zitat antworten
  #6  
Alt 27.07.2005, 10:58:14
henning666 henning666 ist offline
Anfänger
 
Registriert seit: Jul 2005
Beiträge: 12
AW: Optimierung bei INNER JOIN mit großen Tabellen

By the Way

wo kann man denn im EXPLAIN ablesen was indexiert ist?

Ich Google mal.

Henning
Mit Zitat antworten
  #7  
Alt 27.07.2005, 11:26:00
feuervogel feuervogel ist offline
SELFPHP Guru
 
Registriert seit: Jan 2004
Ort: Leipzig
Beiträge: 4.549
AW: Optimierung bei INNER JOIN mit großen Tabellen

vielleicht wenn du das sql direkt im mysql-client bzw im phpmyadmin ausführst?
Mit Zitat antworten
  #8  
Alt 27.07.2005, 12:51:13
henning666 henning666 ist offline
Anfänger
 
Registriert seit: Jul 2005
Beiträge: 12
AW: Optimierung bei INNER JOIN mit großen Tabellen

Ich wollte eigentlich nur Fragen was die EXPLAIN Angaben bedeuten.
Ich habs im Manual gefunden.

Danke

Henning
Mit Zitat antworten
  #9  
Alt 27.07.2005, 13:42:25
Benutzerbild von xabbuh
xabbuh xabbuh ist offline
SELFPHP Guru
 
Registriert seit: May 2003
Beiträge: 7.187
AW: Optimierung bei INNER JOIN mit großen Tabellen

Hier wird die Ausgabe von EXPLAIN erläutert.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Inner Join wollenschlaeger MySQLi/PDO/(MySQL) 2 09.11.2004 22:01:28
Hilfe zu inner join 9536 MySQLi/PDO/(MySQL) 12 12.02.2004 16:02:00
SQL Abfrage (INNER JOIN) AlexWeber MySQLi/PDO/(MySQL) 6 08.10.2003 09:10:39
mysql query mit Join problem Silencer PHP für Fortgeschrittene und Experten 4 18.03.2003 15:38:31
Cold Fusion & PHP Nonstop PHP Grundlagen 2 16.06.2002 13:30:52


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:21:46 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt