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 ::

Websites optimieren für Google & Co.

Websites optimieren für Google & Co. 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 > 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

 
 
Themen-Optionen Ansicht
  #1  
Alt 27.10.2010, 20:47:23
droehn droehn ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 51
Beiträge: 19
COUNT mit JOINs und sub-queries kriechend langsam

Moin zusammen,

ich habe mit 6 Tabellen eine Artikeldatenbank unter MYSQL / MyISAM zusammengebastelt.
Darin sind gegenwärtig je 60'000 Positionen gespeichert - ausser bei der Tabelle 'labels', die für jeden Artikel eine Beschreibung in drei Sprachen enthält, also rund 180'000 Einträge. Die Tabellen haben zusammen ein Gewicht von ca. 30MB.

Die grundsätzlich erzeugte Liste (d.h. ohne Filtereinstellungen) zeigt jeweils 30 Sätze pro Seite an, und um weitere Seiten anwählen zu können, benötige ich einen COUNT, um die Anzahl der Folgeseiten auszurechnen, bzw. die Anzahl der gefundenen Datensätze anzuzeigen.

Der COUNT sieht folgendermassen aus:

Code:
SELECT COUNT
	(t1.id) 
FROM 
	articles AS t1 
LEFT JOIN
	labels AS p11
ON
	(
		p11.artikleid = t1.id
	AND
		p11.lang = 'deutsch'
	AND
		p11.deleted != '1'
	)
JOIN
	suppliers AS p12
ON
	(
		p12.artikleid = t1.id
	AND
		p12.deleted != '1'
	)
LEFT JOIN	
	suppliernames as r20
ON
	(
		r20.id = p12.supplierid
	AND
		r20.deleted != '1'
	)
LEFT JOIN
	purchprices AS p13
ON
	(
		p13.artikleid = t1.id
	AND
		p13.supplierid = r20.id
	AND
		p13.deleted != '1'
	AND
		p13.validfrom = (
				SELECT 
					MAX(p13b.validfrom)
				FROM
					purchprices AS p13b 
				WHERE
					p13b.artikleid = p13.artikleid
				AND 
					p13b.supplierid = p13.supplierid
				AND 
					p13b.deleted != '1' 
				AND 
					p13b.validfrom < '1285521549'
		)
	)
LEFT JOIN
	salesprices AS p15
ON
	(
		p15.artikleid = t1.id
	AND
		p15.deleted != '1'
	AND
		p15.validfrom = (
				SELECT 
					MAX(p15b.validfrom)
				FROM
					salesprices AS p15b 
				WHERE
					p15b.artikleid = p15.artikleid
				AND 
					p15b.deleted != '1' 
				AND 
					p15b.validfrom < '1288203628'
		)
	)
WHERE
	t1.deleted != '1'
Die Auswertung in PHP geschieht über
Code:
mysql_result($num, 0, 0)
Die JOINS backen naturgemäss die unterschiedlichen Teilinformationen zu einem kompletten Artikelstammsatz zusammen und die Sub-Queries filtern aus, welches die gültigen Preise gemäss dem heutigen Datum sind.

Diese Abfrage dauert auf einem Dual Core 1,6 MHz MS Vista Laptop rund 10 Sekunden.
Durch entfernen der Subqueries werden daraus 5 Sekunden - aber leider brauche ich diese Routinen ja...

Dieselbe Abfrage als SELECT und LIMIT 0,30 dauert 0,0675 Sekunden.

Natürlich habe ich alle relevanten Spalten ordnungsgemäss indiziert (glaub' ich wenigstens). COUNT(*) und mysql_num_rows habe ich mit leicht schlechteren Ergebnissen ausprobiert.

Ich halte die paar Einträge eigentlich nicht für so viel, wenn man berücksichtigt, dass MySQL mit Millionen von Einträgen prima umgehen kann. Aber vielleicht zwinge ich MySQL mit der o.g. Abfrage tatsächlich in die Knie? Entsprechen die von mir gemachten Angaben tatsächlich der Realität oder gibt es gegenteilige Meinungen, bzw. Vorschläge, wie ich es besser machen kann? Im letzteren Fall würde ich gerne die Tabellenstrukturen, Indizies, EXPLAIN-Auswertungen etc. posten.

Vielen Dank für Euer Feedback und bis denne
David
Mit Zitat antworten
 

Stichworte
count, join, langsam, mysql, subquery


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


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:53:30 Uhr.


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


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