Sonstiges > Offtopic
SQL-Statement - Performance schlecht!
DaWutz:
--- Zitat ---Vielleicht gibt es diesen QueryCache doch schon in mySql 4.0 Huh
--- Ende Zitat ---
Du hast natürlich recht, den QueryCache gibts schon. Ich habe nun mal ein wenig mit den Werten dieser Parameter gespielt, und habe recht ansehnlich Ergebnisse erzielt. Ich werde das aber morgen noch ein wenig weiter austesten müssen, um zu sehen, ob miene Ergebnisse nun auch aussagekräftig sind.
Bis morgen,
Daniel!
flaite:
Cool 8)
Wie viele Tupel (Datensätze) sind eigentlich in dem Resultset?
Wenn das sehr viele sind, ist vielleicht ein Anwendungs-Cache auch nicht das wahre, weil das dann vielleicht einfach zu viel vom Arbeitsspeicher wegnimmt.
Ich bin da auch nicht so der super-guru. Nur das erschien mir schon ein Fall für einen cache auf die eine oder andere Weise. Damit kann man die wirklich dicken Performance-Gewinne erzielen. Problematisch sind caches natürlich bei vielen updates.
DaWutz:
Zwischenstand:
Verbesserung von bisher 39 auf 10 Sekunden! :D
Wodurch:
* Ich hab das "böse" LIKE ersetzt durch BETWEEN - grenzt meinen Bereich weiter ein und scheint dadurch gleich drastisch performanter zu sein.
* Ich habe 2 neue Indexe auf die benutzten Spalte der Tabelle gesetzt
* Ein paar Drehungen an den Parametern query_cache_limit, query_cache_size
* Neuordnen der Tabelle durch "ALTER TABLE billing_data ORDER BY data_starttime, data_site"
Nun werde ich das ganze mal weiter beobachten und schauen was weiter passiert.
Ach ja, das Resultset hat eigentlich nur 15 Tupel, aber die für die Berechnung - das SUM und ROUND usw. - werden pro Monat 285000 Tupel durchforstet.
Edit:
Hier das "neue" Statement:
--- Code: ---SELECT HIGH_PRIORITY
c.customer_name AS 'customer',
c.customer_freevolume AS 'freevolume',
c.customer_price_per_gb AS 'pricePerGB',
c.customer_currency AS 'currency',
ROUND(((SUM(d.data_recievedbytes) + sum(d.data_sendbytes))/1073741824),3) AS 'traffic',
ROUND(((SUM(d.data_recievedbytes) + sum(d.data_sendbytes))/1073741824),3) - c.customer_freevolume AS 'billedTraffic'
FROM billing_data d, billing_customer c
WHERE d.data_starttime BETWEEN '20051001000000' AND '20051031235959'
AND MID(d.data_site,3,3) = c.customer_short
GROUP BY c.customer_name
--- Ende Code ---
flaite:
Aber noch mal: Kann man den Inhalt des Resultsets nicht in der PHP Anwendung als globales Objekt speichern? Zumindest in php 5 scheint es so etwas zu geben:
http://www.sitepoint.com/forums/showthread.php?t=305737
Oder/und der global scope von dem die hier reden:
http://www.webreference.com/programming/phpanth2/3.html
Das scheint doch so etwas zu sein. Du brauchst noch nicht mal unbedingt Objekte (natürlich besser). EinfachSchwieriger das Resultset als 2-dimensionalen Array speichern?
Diesen Array bei dem ersten Request am Tag auf null setzen und neu aus der Datenbank füllen?
Alle Requests des Tages nach dem ersten holen sich die Daten aus dem globalen Objekt und nicht aus der Datenbank.
Falls es keinen scope für anwendungs-globale Objekte/Arrays in php gibt (was ich nicht glaube), kannst du dir sogar überlegen, die 15 Tupel in einer Datei zwischenzuspeichern. Das ist zwar auch unschön, aber besser als den User jedesmal 10 sek. warten lassen, wenn er drauf zugreift.
Axel
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln