zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Queries und Performance

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 13.04.2006, 22:18
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.11.2005
Beiträge: 175
insanic! befindet sich auf einem aufstrebenden Ast
Standard Queries und Performance

Hi,

habe mal wieder ne Frage zu 2 Queries, die langsam sind: Wie man diese verbessern kann!

1. Query:
Code:
SELECT 		
			/*** AUS DER TABELLE OWN_CONTENT ***/ 
			o.id 					AS oid, 
			o.time 					AS otime, 
			o.disNaviReferer 		AS showR, 
			o.disNaviToplist 		AS showT, 
			o.disNaviPartner 		AS showP, 
			o.type, 
			o.used, 
			
			/*** AUS DER TABELLE LINK_CATS ***/ 
			c.id 					AS cid, 
			c.name 					AS catname, 
			
			/*** AUS DER TABELLE LINK_ENTRIES ***/ 
			e.id 					AS eid, 
			e.beschreibung 			AS linkdesc, 
			e.flag, 
			e.freigeschaltet 		AS etime, 
			e.previewPic 			AS prev, 
			e.hits 
FROM 
			own_content o 
LEFT JOIN 
			link_entries e 
				ON e.link = o.id 
LEFT JOIN 
			link_cats c 
				ON c.id = e.cat_id 
ORDER BY 
			oid desc 
LIMIT 		0, 20
Wenn ich diesen per Explain in PhpMyAdmin ausführe, bekomme ich folgende Ausgabe:


Indizes sind gesetzt auf:
- link-cats: id
- link_entries: id, cat_id, freigeschaltet, flag
- own_content: id

Teilweise kommen noch ein paar Where-Klauseln dazu (aber der Query so wie er da steht ist schon lahm).




2. Query:
Code:
SELECT 		count(o.id) AS anz 
FROM 		own_content o 
LEFT JOIN 	link_entries e 
			ON e.link = o.id 
LEFT JOIN 	link_cats c 
			ON c.id = e.cat_id
Selben Indizes.
Wenn ihr mich hier nun fragt, warum ich die LeftJoins drin habe, wenn ich doch eh nur o.id zählen will: Weil ich teilweise eine Where-Klausel nutzte, in der ich c.id und e.flag benötige!

Was kann ich nun verbessern?

Danke!!
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 13.04.2006, 22:26
Benutzerbild von The Doc
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 19.01.2005
Beiträge: 1.114
The Doc befindet sich auf einem aufstrebenden Ast
Standard

1. : link_entries: link

2. : wenn du nur manchmal Where benutzt, dann benutzt auch nur manchmal die längere Query, is doch logisch...
__________________
Bitte keine PN's - schreibt mir ne anständige Mail oder sprecht mich über Msn / Icq an
Milian Wolff | Markdownify | Typogridder
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 13.04.2006, 22:39
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.11.2005
Beiträge: 175
insanic! befindet sich auf einem aufstrebenden Ast
Standard

2. hab ich grad gemacht
Hab einfach beim 2. Query die LeftJoins nur dann gesetzt, falls WHERE genutzt wird

zum Index: danke, versuch ich mal
Mit Zitat antworten
  #4 (permalink)  
Alt 13.04.2006, 22:42
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.11.2005
Beiträge: 175
insanic! befindet sich auf einem aufstrebenden Ast
Standard

hm, der Index hat mir nichts gebracht:
Mit Zitat antworten
  #5 (permalink)  
Alt 14.04.2006, 00:04
Jan Jan ist offline
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 27.02.2005
Beiträge: 175
Jan befindet sich auf einem aufstrebenden Ast
Standard

Hi!

Ich glaube bald, dass man dort nicht viel machen kann. Es müssen ja alle Zeilen ausgelesen werden. Eine andere Alternative gibt es nicht. Anders würde die Sache aussehen, wenn du eine WHERE-Klausel einfügst. Oder denke ich da jetzt völlig verkehrt?

Vielleicht hilft es auch in diesem Fall, den großen Join in kleinere effiziente Teile aufzusplitten.

Gruß
Jan
Mit Zitat antworten
  #6 (permalink)  
Alt 14.04.2006, 00:33
Benutzerbild von The Doc
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 19.01.2005
Beiträge: 1.114
The Doc befindet sich auf einem aufstrebenden Ast
Standard

hmm, aber imho müsste doch bei
Code:
LEFT JOIN
         link_entries e
            ON e.link = o.id
mit e.link als Index was besseres als ALL zustande kommen, oder?
__________________
Bitte keine PN's - schreibt mir ne anständige Mail oder sprecht mich über Msn / Icq an
Milian Wolff | Markdownify | Typogridder
Mit Zitat antworten
  #7 (permalink)  
Alt 14.04.2006, 00:38
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.11.2005
Beiträge: 175
insanic! befindet sich auf einem aufstrebenden Ast
Standard

@thedoc: ja, dachte ich eigentlich auch

@jan: hm, naja, weiß nicht genau, wie man das in kleinere teile aufsplitten soll. aber da es "nur" für ein adminmenü ist, ist das eventuell den aufwand nicht wert...
Mit Zitat antworten
  #8 (permalink)  
Alt 14.04.2006, 13:22
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.11.2005
Beiträge: 175
insanic! befindet sich auf einem aufstrebenden Ast
Standard

in einem Forum habe ich noch einen Hinweis auf die Funktion SQL_CALC_FOUND_ROWS gefunden! Habe mal bei Google danach gesucht:

http://news.php-homepage.de/archives...OUND_ROWS.html

http://dev.mysql.com/doc/refman/4.1/...functions.html unter dem Punkt 'Found rows'

Eventuell werde ich das mal ausprobieren

Edit: 5 Kommentar von oben auf http://php3.de/mysql-num-rows besagt:
Code:
I find that mysql_num_rows() overlook LIMIT clauses.
For instance:

//table has 700 rows
$command = "SELECT * FROM table LIMIT 500";
$q = mysql_query($command);
$rows = mysql_num_rows($q);

//$rows is 700
Das ist dann wahrscheinlich das, was ich brauche, oder?
Mit Zitat antworten
  #9 (permalink)  
Alt 14.04.2006, 16:30
Jan Jan ist offline
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 27.02.2005
Beiträge: 175
Jan befindet sich auf einem aufstrebenden Ast
Standard

Hi!

Zitat:
Zitat von insanic
@jan: hm, naja, weiß nicht genau, wie man das in kleinere teile aufsplitten soll. aber da es "nur" für ein adminmenü ist, ist das eventuell den aufwand nicht wert...
Stimmt, das lohnt sich wirklich nicht. Was passiert den bei LIMIT 0,500?

Was mir gerade noch einfällt. Hast du den Query vielleicht schonmal in einen inner Join umgeschrieben?

Gruß
Jan
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 14.04.2006, 20:00
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 03.11.2005
Beiträge: 175
insanic! befindet sich auf einem aufstrebenden Ast
Standard

@Jan: Warum Limit 0, 500? Dann habe ich doch auch nicht alle Datensätze per count() oder? Inner Join, was genau ist das? Bzw wenn ich einen LEFT JOIN nutzte, darf ich dann einfach einen Inner Join draus machen?

Ich habe nun mal das mit dem SQL_CALC_FOUND_ROWS bei einem anderen Script versucht, hat bestens funktioniert!

Dies werde ich eventuell auch hier demnächst mal versuchen
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
mod_rewrite Performance bei vielen Regeln fox Serveradministration und serverseitige Scripte 7 25.09.2008 03:02
Queries für verschiedene DBs generieren lassen Schelm.isch Serveradministration und serverseitige Scripte 5 23.06.2008 18:26
[mysql-DB] Performance bei Struktur-Änderungen von großen Tabellen mantiz Serveradministration und serverseitige Scripte 7 26.02.2008 14:02
[PHP] Initialisierung von Funktionen - Performance? Tigereye Serveradministration und serverseitige Scripte 4 27.09.2006 13:42
Meine Queries optimieren insanic! Serveradministration und serverseitige Scripte 30 18.03.2006 16:05


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:55 Uhr.