Seite 1 von 2
Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 16:37
von Fox Mulder
Hi, eine Frage an die Datenbank und MySQL Experten.
Ich habe eine MySQL 5 Tabelle mit mit mehr als einer Million Datensätzen.
Trotz der hohen Anzahl an Datensätzen ist die Performance bei select statments recht befriedigend, mit folgender Ausnahme:
Code: Alles auswählen
select spalte1 from tabelle where spalte2 = '1' limit 1000000, 20
Also frei übersetzt: Hole mir 20 Werte von spalte1 wo spalte2 = 1 ist, ab dem Startwert 1000000.
Die Query braucht rund 28 Sekunden. Einen (normalen) Index auf spalte2 habe ich gesetzt.
Kann man dieses select noch irgendwie performanter machen??
Verfasst:
von
SEO Consulting bei
ABAKUS Internet Marketing Erfahrung seit 2002
- persönliche Betreuung
- individuelle Beratung
- kompetente Umsetzung
Jetzt anfragen:
0511 / 300325-0.
Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 17:15
von fornex
wie oft verändert sich diese tabelle?
Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 17:22
von kill_bill
Ist Spalte2 ein Integer?
Index auf Spalte 2 legen.
Verfasst: 23.04.2006, 17:29
von simon
hat er doch schon

Re: Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 17:29
von Fox Mulder
fornex hat geschrieben:wie oft verändert sich diese tabelle?
@fornex
Die Tabelle ist fast statisch.
Eventuell ist es besser wenn ich auf die 20 Datensätze über eine while Schleife einzeln zugreife , also:
while (.....)
select spalte1 from tabelle where spalte2 = '1' limit 1000000, 1
und
select spalte1 from tabelle where spalte2 = '1' limit 1000001, 1
und
select spalte1 from tabelle where spalte2 = '1' limit 1000002, 1
..usw .....
Aber wie setze ich die Resultsets nachher wieder zu einem Result zusammen?? (Arrays waren nie meine Stärke)
Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 17:45
von simon
läuft der select denn schneller ab wenn du den limit teil weg lässt?
Re: Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 17:46
von Fox Mulder
Fox Mulder hat geschrieben:Eventuell ist es besser wenn ich auf die 20 Datensätze über eine while Schleife einzeln zugreife , also:
nee, das war quatsch.
Verfasst: 23.04.2006, 17:47
von HW
..das mit der While-Schleife vergisst Du wohl besser.
Dein Problem scheint zu sein, dass es sich bei Spalte 2 um ein String-Feld handelt.
Wenn es irgend möglich ist würde ich die Spalte in einen Integer umwandeln.
Dann solltest Du auch eine halbwegs vernünftige Performance kriegen.
Dann musst Du auch überlegen, ob das Ergebnis nicht gecached werden kann.
Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 17:56
von Kristian
Hallo
Ich sehe die Situation so, dass erstmal 1000000 Ergebnisse gefunden werden müssen bis die DB zum gewünschten Ergebnis kommt, das dauert halt und daran wird sich nicht wirklich etwas ändern lassen.
Ev. muss man bei der Anzahl den Aufbau der DB überdenken?
Gruss Kristian
Verfasst: 23.04.2006, 17:57
von Fox Mulder
HW hat geschrieben:Wenn es irgend möglich ist würde ich die Spalte in einen Integer umwandeln.
Dann solltest Du auch eine halbwegs vernünftige Performance kriegen.
Dann musst Du auch überlegen, ob das Ergebnis nicht gecached werden kann.
Ist ein Integer Feld (mediumint).
Das Caching mache ich ja, aber auch diese Abfrage muss irgendwann mal das erste mal gestellt werden.
Ich könnte dem User der das auf der Webseite macht ja Schmerzensgeld Zahlen...?

Re: Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 18:01
von Fox Mulder
Kristian hat geschrieben:Ich sehe die Situation so, dass erstmal 1000000 Ergebnisse gefunden werden müssen bis die DB zum gewünschten Ergebnis kommt, das dauert halt und daran wird sich nicht wirklich etwas ändern lassen.
Kristian, Du machst mir da nicht viel Hoffnung.
Verfasst: 23.04.2006, 18:02
von oldInternetUser
Fox Mulder hat geschrieben:Ist ein Integer Feld (mediumint).
Dann sollte auch nach
Where Spalte2 = 1
gefragt werden. Nicht, daß mySql erst einmal alle Zeilen in Strings umwandelt.
Edit: Abgesehen davon: Die Tabelle hat hoffentlich einen Primärschlüssel.
Verfasst: 23.04.2006, 18:06
von Fox Mulder
oldInternetUser hat geschrieben:gefragt werden. Nicht, daß mySql erst einmal alle Zeilen in Strings umwandelt.
Edit: Abgesehen davon: Die Tabelle hat hoffentlich einen Primärschlüssel.
Primärschlüssel ist/war da.
"Where Spalte2 = 1" bringt 8 Sekunden
Danke!!
Sind aber immer noch 20 Sek für die Query.
Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 18:13
von simon
nochmal: wie lange dauert die abfrage ohne den limit teil?
Re: Kann man aus der Query noch Performance rausholen
Verfasst: 23.04.2006, 18:18
von Fox Mulder
simon hat geschrieben:nochmal: wie lange dauert die abfrage ohne den limit teil?
Ohne Limit läuft die Query ca 60 Sekunden, also mehr als doppelt so lang.