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