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.
simon
PostRank 2
PostRank 2
Beiträge: 34
Registriert: 18.04.2006, 17:04

Beitrag von simon » 23.04.2006, 18:23

hmmm, vielleicht postest du einfach mal den kompletten CREATE

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.


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

Beitrag von oldInternetUser » 23.04.2006, 18:28

Fox Mulder hat geschrieben:Where Spalte2 = 1" bringt 8 Sekunden
Schön zu wissen, ich war immer zu faul, das mal zu testen.

Ist der Index auf der Spalte2 sehr selektiv?

Also: Hat die Spalte2 mindestens 100 verschiedene Werte?

Oder sind das nur 5 - 10 Werte (1, 2, 3, ..., 10)?

Falls letzteres: Entferne testweise den Index, so ein Index kann verlangsamen.

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

Beitrag von Kristian » 23.04.2006, 19:09

Hallo

@Fox
> Kristian, Du machst mir da nicht viel Hoffnung.

Sei beruhigt ich habe von MySQL nicht wirklich Ahnung, war mir immer zu langsam...
Ich benutze diese DB's nur wenn ich muß oder flexibel in den Abfragen sein will.

Mein erster Gedanke wäre:
Splitte die DB in diverse kleine, so max 100.000 Einträge, besser weniger.
Mache auf diese DB'S einen Abfrage mit "show count..." (hoffe ich erinnere mich richtig)
Entscheide aus den erhaltenen Counts, welche DB du zu dem Ergebnis befragen willst.
Wenn du die (count)DB-Abfragen dann noch parallel hinbekommst solltest du IMHO einen Performance-Schub erleben.

Aber wie gesgt, ich darf da eigentlich nicht mitreden.

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 » 24.04.2006, 06:00

Eventuell kann man ja an der mysql Server Performance noch was drehen?

Die DB Größe ist ca. 1000 MB auf einem Windows Sytem mit 2048 MB Ram.

Meine my.ini Parameter:

query-cache-type = 1
query_cache_limit = 10M
query-cache-size = 100M
set-variable=key_buffer=100M
set-variable=table_cache=64
set-variable=sort_buffer=16M
set-variable=record_buffer=8M

An welchen Parametern muss ich den Schrauben um mein Ram für die obige Query optimal bereitzustellen?

ts77
PostRank 4
PostRank 4
Beiträge: 146
Registriert: 03.02.2005, 13:58

Beitrag von ts77 » 24.04.2006, 09:46

naja, die 60 Sekunden sind wohl eher für die Ausgabe der angeblichen Millionen-Einträge ;).
Kannst Du das Query vielleicht im Where-Teil noch ein wenig mehr einschränken?

In der Art
spalte2=1 AND id > 100000
oder sowas?

Bei Limit-Abfragen muß der Server wirklich erst das komplette Resultset aufbauen und gibt Dir dann nur den Teil zurück, das dauert halt.

gsingle
PostRank 4
PostRank 4
Beiträge: 113
Registriert: 25.08.2005, 00:26
Wohnort: Deutschland

Beitrag von gsingle » 24.04.2006, 12:28

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?
Da kann ich nur voll und ganz zustimmen.

Evtl solltest Du deine Daten in mehrere Tabellen "zerlegen".
Eventuell steigert es die Effizienz, häufig benötigte Datensätze zusätzlich in einer zweiten Tabelle (die dann wesentlich kleiner ist...) vorzuhalten.

Zum aktualisieren dieser "zwischeN" Tabelle bräuchtest Du dann nur wenige SQL Queries (jedesmal wenn sich an den Hauptdaten etwas ändert eben auch die "zwischen"Tabelle aktualisieren) , und könntest die Produktiven Anfragen an die kleinere Zwischentabelle stellen.

Nur so ein Gedanke....

hth

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

Beitrag von Fox Mulder » 24.04.2006, 15:24

Die Lösung :D :D :D :D

Ausgangsquery:

select spalte1 from tabelle where spalte2 = 1 limit 1000000, 20
- Laufzeit (result : 20, time : 23.0382)

Optimierung (im Groben):

$start_daten = 1000000;

select id as curr_id from tabelle where spalte2 = 1 limit 1
- Laufzeit (result : 1, time : 0.0077)

$start_id= curr_id + $start_daten;

select * from idx_link where spalte2 = 1 and id >= $start_id limit 20
- Laufzeit (result : 20, time : 0.0026)

Gesamte Ausführungszeit rund 0.01 Sekunden.

Dies gelingt nur unter der Voraussetzung das Spalte "id" fortlaufend, (ohne Lücken) und spalte2 sortiert nach Werten ist.

ts77
PostRank 4
PostRank 4
Beiträge: 146
Registriert: 03.02.2005, 13:58

Beitrag von ts77 » 24.04.2006, 15:33

mal ne dumme frage:
was holst Du Dir hier?
> select id as curr_id from tabelle where spalte2 = 1 limit 1

Willst Du das nicht noch irgendwie sortieren? Oder gibt es nur eine Zeile mit diesem Wert?
Ich würd ja noch ein Order by zur Sicherheit mit reinnehmen, sonst ist nicht garantiert, dass die Ergebnisse in der richtigen Reihenfolge herauskommen (soweit ich weiß).

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

Beitrag von Kristian » 24.04.2006, 15:40

Hallo
Setzt das nicht auch vorraus, dass die Ergebnisse von curr_id bis curr_id + 1000000 alle die Bedingung spalte2 = 1 erfüllen?
IMHO könntest du auch blind mit der Suche bei id > 1000000 beginnen.
Es könnte auch sein, dass du mit 2000000 beginnen kannst und die gleichen Ergebnisse bekommst.
Generell ist es aber keine schlechte Idee Zeit zu sparen indem man den Startpunkt der Suche auf einen logischen Wert legt.
Gruss Kristian
Seo-Check Biete Links zu Schmuck und Hochzeit sowie Artikelplätze für Firmen allgemein.

tingting
PostRank 4
PostRank 4
Beiträge: 107
Registriert: 18.10.2004, 09:49
Wohnort: München

Beitrag von tingting » 24.04.2006, 16:37

versuche mal folgendes.


select spalte1 from tabelle order by spalte2 limit 20

zwar ist nicht gegeben dass die ergebnisse der spalte2 alle 1 sind, kann man ja abfragen.

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

Beitrag von Fox Mulder » 24.04.2006, 17:03

Kristian hat geschrieben:Hallo
Setzt das nicht auch vorraus, dass die Ergebnisse von curr_id bis curr_id + 1000000 alle die Bedingung spalte2 = 1 erfüllen?
Das sowieso.
(siehe oben: Dies gelingt nur unter der Voraussetzung das Spalte "id" fortlaufend, (ohne Lücken) und spalte2 sortiert nach Werten ist.
)
Kristian hat geschrieben: IMHO könntest du auch blind mit der Suche bei id > 1000000 beginnen.
Es könnte auch sein, dass du mit 2000000 beginnen kannst und die gleichen Ergebnisse bekommst.
Nein gerade nicht! Den ersten Wert (curr_id) hole ich mir ja hier mit dieser Abfrage:
select id as curr_id from tabelle where spalte2 = 1 limit 1

Dazu wird dann die 1000000 hinzugezählt und von da an die eigenlichen Werte gesucht.

Es klappt hervorragend und nicht anderes zählt.

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

Beitrag von Kristian » 24.04.2006, 17:16

Hallo
Wenn dem so ist wird dir die Abfrage
"select id as curr_id from tabelle where spalte2 = 1 limit 1" den Wert 1 liefern.
Wenn dem so ist kannst du aber definitv bei 1000000 bzw. 1000001 anfangen.

Achso, dieses "as" verwendet man, wenn die Afrage mehrere Tables beinhaltet, die gleiche Feldnamen haben, sonst ist es eher nicht sinnig.

Gruss Kristian

[EDIT]
Ich bemerke gerade meinen Denkfehler. sortiert = 0 vor 1
Ok dann hast du Recht, die erste Abfrage muss sein
Seo-Check Biete Links zu Schmuck und Hochzeit sowie Artikelplätze für Firmen allgemein.

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag