Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Kann man aus der Query noch Performance rausholen

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 23.04.2006, 16:37

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??

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


fornex
PostRank 4
PostRank 4
Beiträge: 154
Registriert: 01.03.2006, 01:14
Wohnort: :tronhoW

Beitrag von fornex » 23.04.2006, 17:15

wie oft verändert sich diese tabelle?
Suche Linkpartner für Bereiche:
Flirt - Fun - Erotik - 1 Click Hoster

ICQ: 7o7727

Googlebot versteht Javascript

kill_bill
PostRank 8
PostRank 8
Beiträge: 882
Registriert: 07.07.2005, 00:31
Wohnort: Meppen

Beitrag von kill_bill » 23.04.2006, 17:22

Ist Spalte2 ein Integer?
Index auf Spalte 2 legen.

Code: Alles auswählen

ALTER TABLE `tabelle` ADD INDEX ( `spalte2` )

simon
PostRank 2
PostRank 2
Beiträge: 34
Registriert: 18.04.2006, 17:04

Beitrag von simon » 23.04.2006, 17:29

hat er doch schon ;-)

Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 23.04.2006, 17:29

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)

simon
PostRank 2
PostRank 2
Beiträge: 34
Registriert: 18.04.2006, 17:04

Beitrag von simon » 23.04.2006, 17:45

läuft der select denn schneller ab wenn du den limit teil weg lässt?

Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 23.04.2006, 17:46

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.

HW
PostRank 8
PostRank 8
Beiträge: 761
Registriert: 04.04.2004, 08:00
Wohnort: Viersen

Beitrag von HW » 23.04.2006, 17:47

..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.

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 23.04.2006, 17:56

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
Seo-Check Biete Links zu Schmuck und Hochzeit sowie Artikelplätze für Firmen allgemein.

Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 23.04.2006, 17:57

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...? :P

Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 23.04.2006, 18:01

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.

oldInternetUser
PostRank 9
PostRank 9
Beiträge: 1250
Registriert: 19.03.2005, 12:52

Beitrag von oldInternetUser » 23.04.2006, 18:02

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.

Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 23.04.2006, 18:06

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.

simon
PostRank 2
PostRank 2
Beiträge: 34
Registriert: 18.04.2006, 17:04

Beitrag von simon » 23.04.2006, 18:13

nochmal: wie lange dauert die abfrage ohne den limit teil?

Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 23.04.2006, 18:18

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.

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag