php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.05.2005, 09:32  
Erfahrener Benutzer
 
Registriert seit: 08.02.2005
Beiträge: 224
lomtas
lomtas eine Nachricht über ICQ schicken
Standard 0,3 sek sind zuviel!

Hallo,

momentan optimiere ich gerade eine selbst gebastelte Besucherstatistik. Diese liefert mir schon die Sachen, die ich gerne hätte, jedoch sind meine Abfragen zu langsam. Deswegen versuche ich gerade die Zeiten zu optimieren. Habe nun folgende Struktur:

Es gibt eine Besuchertabelle in die jeder Besucher eingetragen wird (momentan 15000 Einträge). Es werden einige Daten mitgeloggt. Unter anderem auch der Referer und der User_agent. Diese werden allerdings ausgelagert in extra Tabellen. Also habe ich drei tabellen: cms_besucher, cms_referer und cms_browser (für die user-agents).

Nun möchte ich herausbekommen, an welchem Tage ich die maximale Besucheranzahl hatte und wie viele das waren. Dafür habe ich folgende Abfrage:

Code:
select count(*) as anzahl,date_format(datumzeit,'%d.%m.%y') as datum from cms_besucher JOIN cms_browser ON cms_besucher.browser_id=cms_browser.browser_id JOIN cms_referer ON cms_besucher.referer_id=cms_referer.referer_id where isrobot=0 and showlink=1 group by date_format(datumzeit, '%Y-%m-%d') order by anzahl desc
Dann brauche ich eigentlich nur noch den obersten Eintrag nehmen und schon habe ich die gebrauchte anzahl. Er rechnet mir bei diesem Beispiel für jeden Tag die maximale Zahl aus und sortiert diese dann. Je mehr Tage es werden, desto länger dauert die Prozedur. Momentan bin ich alleine für diese Berechnung bei 0,3 Sekunden.

Weiß jemand Rat. Sieht jemand vielleicht Möglichkeiten meine MySQL-Abfrage zu verbessern? Bin für jede Hilfe dankbar!
lomtas ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.05.2005, 10:05  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

mach mal ein EXPLAIN auf das SELECT:
http://dev.mysql.com/doc/mysql/de/explain.html

Was sagt das?
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 24.05.2005, 10:15  
Erfahrener Benutzer
 
Registriert seit: 08.02.2005
Beiträge: 224
lomtas
lomtas eine Nachricht über ICQ schicken
Standard

Das Explain sagt folgendes:
cms_referer
type: ALL
possible keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 667
Extra: Using where; Using temporary; Using filesort
cms_besucher
type: ref
possible keys: INDEX,INDEX2
key: INDEX2
key_len: 5
ref: cms_referer.referer_id
rows: 22
Extra: Using where
cms_browser
type: eq_ref
possible keys: PRIMARY
key: PRIMARY
key_len: 4
ref: cms_besucher.browser_id
rows: 1
Extra: Using where
lomtas ist offline   Mit Zitat antworten
Alt 24.05.2005, 10:26  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Erstmal scheint der Index auf cms_referer unzureichend, ich schätze, Du brauchst da nen multi-column-Index, der auch isrobot und showlink abdeckt. Das Problem ist behoben, sobald EXPLAIN zu cms_referer nicht mehr "key: NULL" sagt.

Dazu fällt mir noch ein, dass man zur Laufzweit berechnete Daten wie z.B. date_format(datumzeit, '%Y-%m-%d') nicht für Vergleiche (oder Sortierungen oder oder...) verwenden sollte, sondern nur Daten, die in einem nutzbaren Index stehen.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 24.05.2005, 10:51  
Erfahrener Benutzer
 
Registriert seit: 08.02.2005
Beiträge: 224
lomtas
lomtas eine Nachricht über ICQ schicken
Standard

also wenn ich dich richtig verstanden habe, muss ich nun einen index für isrobot und für showlink anlegen?

wie kann man außer mit date_format noch das datum aus datumzeit rausholen, denn das brauche ich ja für meinen vergleich. oder soll das heißen, dass der typ datetime von mysql eigentlich schwachsinn ist und man eigentlich zwei felder anlegen sollte: eines vom typ date und eines vom typ time??
lomtas ist offline   Mit Zitat antworten
Alt 24.05.2005, 11:17  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von lomtas
also wenn ich dich richtig verstanden habe, muss ich nun einen index für isrobot und für showlink anlegen?
Einen multi-column auf referer_id, isrobot und showlink, wenn ich das richtig verstanden habe, ohne die Tabellendefinitionen vor der Nase zu haben ist das ein wenig Raterei.

Zitat:
Zitat von lomtas
dass der typ datetime von mysql eigentlich schwachsinn ist und man eigentlich zwei felder anlegen sollte: eines vom typ date und eines vom typ time??
Generell nein, wobei Du auch erstmal gucken solltest, wie weit dich der Index bringt, bevor Du ein eigenes Feld nur für das Datum anlegst.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 24.05.2005, 11:39  
Erfahrener Benutzer
 
Registriert seit: 08.02.2005
Beiträge: 224
lomtas
lomtas eine Nachricht über ICQ schicken
Standard

Das Problem ist aber, dass referer_id und showlink in der einen tabelle sind und isrobot in der anderen. Kann man da auch einen multicolumn index anlegen?
lomtas ist offline   Mit Zitat antworten
Alt 24.05.2005, 11:44  
Erfahrener Benutzer
 
Registriert seit: 08.02.2005
Beiträge: 224
lomtas
lomtas eine Nachricht über ICQ schicken
Standard

mit index anlegen und so bin ich jetzt auf 0,16 sek.

das ist schon mal gut. aber eigentlich müsste es doch noch schneller gehen.

Zitat:
Das Problem ist behoben, sobald EXPLAIN zu cms_referer nicht mehr "key: NULL" sagt.
momentan sagt er leider immer noch null...
lomtas ist offline   Mit Zitat antworten
Alt 24.05.2005, 11:47  
Erfahrener Benutzer
 
Registriert seit: 08.02.2005
Beiträge: 224
lomtas
lomtas eine Nachricht über ICQ schicken
Standard

also, mal eine kleine auflistung, damit du auch weißt, wie es momentan mit den Indexes aussieht:

cms_besucher
besucher_id (PRIMARY)
browser_id (INDEX)
referer_id (INDEX)
datumzeit (INDEX)
cms_browser
browser_id (PRIMARY)
isrobot (INDEX)
cms_referer
referer_id, showlink (PRIMARY)
group_id (INDEX)

Ist das so okay, oder sollte ich was ändern?
lomtas ist offline   Mit Zitat antworten
Alt 24.05.2005, 18:36  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von lomtas
Ist das so okay, oder sollte ich was ändern?
Gut ist es, wenn auf allen Tabellen Indizes verwendet werden.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Lange Verarbeitungszeiten - Zuviel JavaScript? [-UFO-]Melkor HTML, Usability und Barrierefreiheit 2 15.06.2007 23:54
Es werden zuviel Daten ausgeben Kein Genie PHP Tipps 2006 5 12.11.2006 12:37
Stundenlohn - verlange ich zuviel Cojote Off-Topic Diskussionen 38 29.01.2006 12:33
doofe frage für leute mit zuviel zeit: google eintrag netti Beitragsarchiv 29 28.06.2005 19:38
Login Script schreibt ein echo zuviel Chrisber PHP Tipps 2005-2 11 21.06.2005 17:10
eregi_replace ersetzt mir zuviel :( PHP Tipps 2005 9 01.02.2005 00:22
Zuviel Traffic? themonk Off-Topic Diskussionen 8 14.11.2004 21:21
die() stopp zuviel Stinger PHP Tipps 2004 1 26.10.2004 03:39
[Erledigt] Hab ich zuviel getrunken? PHP Tipps 2004 16 12.07.2004 00:24
zuviel php bringt unglück.......... Off-Topic Diskussionen 16 08.06.2004 14:19

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
explain possible keys

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.