Hallo zusammen,
ich habe mein erstes Projekt bekommen und muss eine Statistikauswertung entwickeln. In die Tabelle kommen laufend Daten an - ca. 20.000 pro Tag bzw. ca. 5 Mio. pro Jahr (das heißt es wird immer mehr – aktuell 19 Mio.). Ich habe 3 Detailtabellen (Ort, Rolle, Link) und eine Verknüpfungstabelle wo alle Tabellen mit einander verbunden werden.
Nun will mein Chef z.B. Wissen wie oft der Kunde in Berlin als Anwender den Linktyp 7 in den letzten 6 Monaten aufgerufen hat. Die Abfragenkriterien will er per PHP-Frontend ändern und andere Abfragen starten. Die Abfragen funktionieren auch richtig - nur es dauert viel zu lang.
Nun zur meiner Frage: Wie kann ich die Abfragen bzw. die Datenbankstruktur ändern damit die Abfragen super schnell erledigt werden können?
Tabellenaufbau: mySQL
tblOrt
tblRolle
tblLink
tblStatistik
Beispielabfrage
ich habe mein erstes Projekt bekommen und muss eine Statistikauswertung entwickeln. In die Tabelle kommen laufend Daten an - ca. 20.000 pro Tag bzw. ca. 5 Mio. pro Jahr (das heißt es wird immer mehr – aktuell 19 Mio.). Ich habe 3 Detailtabellen (Ort, Rolle, Link) und eine Verknüpfungstabelle wo alle Tabellen mit einander verbunden werden.
Nun will mein Chef z.B. Wissen wie oft der Kunde in Berlin als Anwender den Linktyp 7 in den letzten 6 Monaten aufgerufen hat. Die Abfragenkriterien will er per PHP-Frontend ändern und andere Abfragen starten. Die Abfragen funktionieren auch richtig - nur es dauert viel zu lang.
Nun zur meiner Frage: Wie kann ich die Abfragen bzw. die Datenbankstruktur ändern damit die Abfragen super schnell erledigt werden können?
Tabellenaufbau: mySQL
tblOrt
intID | strOrtsname |
1 | München |
2 | Berlin |
tblRolle
intID | strRolleName |
1 | Anwender |
2 | Techniker |
tblLink
intID | strLink | intTyp | bolIsFavorit |
1 | http://www.google.de | 2 | false |
2 | http://www.intranet.de | 7 | true |
tblStatistik
intID | intOrt | intRolle | intLink | tspZeit |
1 | 1 | 2 | 2 | 01.01.2013 05:10:02 |
2 | 1 | 1 | 1 | 22.04.2013 12:17:42 |
Beispielabfrage
Code:
SELECT COUNT(tblStatistik. intOrt) as anzahl,
tblLink.strLink, tblOrt.strOrt, tblRolle.strRolleName
FROM tblStatistik_
INNER JOIN tblLink ON
tblStatistik.intLink = tblLink.intID
INNER JOIN tblOrt ON
tblStatistik.intOrt = tblOrt.intID
WHERE (tblStatistik. tspZeit BETWEEN "20130505000000" AND
AND "20130606235959")
AND (tblLink.intTyp = 7)
AND (tblOrt. strOrtsname LIKE "München")
AND tblStatistik.intRolle LIKE
(SELECT tblRolle.intID
FROM tblRolle WHERE tblRolle.strRollName LIKE 'Anwender')
GROUP BY tblStatistik.intLink
Zuletzt bearbeitet: