Schrift
[thread]3764[/thread]

ORDER BY dauert über 60 Sekunden



<< >> 10 Einträge, 1 Seite
olruebe01
 2007-01-13 01:18
#35091 #35091
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Hallo mal wieder zu meinen beliebten Problemen...

Heutiges Thema: Ein ORDER BY verlangsamt die Abfrage um 60 Sekunden.

Ich habe eine Tabelle mit über 3,1 Mio Zeilen.

Ich mache folgende Abfrage:
Code: (dl )
SELECT * FROM `Produktdaten` WHERE (MATCH (Bezeichnung,Kurzbeschreibung,Beschreibung,Keywords) AGAINST ('SUCHBEGRIFF')) ORDER BY Preis, Bezeichnung LIMIT 0,50


Ich habe folgende Indizes, die ich nach und nach erstellt habe und nach jedem neuen Index neu getestet habe:

1: Fulltext über "Bezeichnung,Kurzbeschreibung,Beschreibung,Keywords"
2: Jeweils ein Index über Preis, Beschreibung, PartnerID (für andere Abfragen)
3: Primary über "laufendeNummer"

Die Abfrage oben dauert ohne ORDER 0,02 Sekunden, mit ORDER über 60 Sekunden.

Wie gesagt: Ich habe die Indizes nach und nach erstellt und immer wieder gestestet. Ohne Verbesserung.
Über BESCHREIBUNG habe ich jetzt 2 Indizes: Einmal mit über den Fulltext und einmal einen eigenen Index um zu sehen, oder dann vielleicht schneller sortiert wird.

Wo liegt mein Fehler?

Danke schon für Eure Hilfe
Strat
 2007-01-13 11:40
#35092 #35092
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn es sich um MySql handelt, was sagt denn DESCRIBE SELECT * FROM .... ORDER BY ... ?

Zum schneller machen: das ORDER BY muss ueber alle zeilen gehen, und eine Menge an Vergleichen ausfuehren, was einfach Zeit dauert. von daher duerfte eine reine aenderung am SQL eher wenig bringen (zumindest faellt mir nichts dazu ein).
Besteht die Moeglichkeit, dieses Problem organisatorisch zu loesen? Dazu habe ich folgende Ideen (kann aber nicht einschaetzen, wie viel die bringen):

Z.B. mit dem SQL-Statement einen VIEW auf die Tabelle setzen, der nach Preis und Bezeichnung sortiert ist:
CREATE VIEW .... SELECT * FROM Produktdaten ORDER BY Preis, Bezeichnung; je nach Datenbank kann das einiges an Geschwindigkeit bringen, weil du dir dann in der endgueltigen Abfrage das ORDER BY sparen kannst. Ist halt die Frage, zu welchem Zeitpunkt der View aktualisiert wird.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
bloonix
 2007-01-13 13:42
#35093 #35093
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Wenn du öfters solche select-order- und auch group by
Statements hast, dann lohnt es sich vielleicht, den MySQL-
Server ein wenig zu tunen, da die Grundeinstellungen für
dickere Sachen nicht mehr ausreichen.

Order-By-Optimation ist nett beschrieben
Server-System-Variables hier am besten nach ORDER suchen.\n\n

<!--EDIT|opi|1168688737-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
olruebe01
 2007-01-13 17:08
#35094 #35094
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
DESCRIBE sagt:
table type possible_keys key key_len ref rows Extra
Produktdaten fulltext text text 0 1 Using where; Using filesort


Jetzt gucke ich nach VIEW und tuning...\n\n

<!--EDIT|olruebe01|1168701072-->
olruebe01
 2007-01-13 17:14
#35095 #35095
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Wie wäre es denn, wenn ich "PREIS" mit in den Fulltext-Index nehme? So wären alle zu sortierenden Spalten im Index.

EDIT: Habe selbst schon gemerkt, dass das Blödsinn ist\n\n

<!--EDIT|olruebe01|1168701561-->
olruebe01
 2007-01-13 17:26
#35096 #35096
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
HALT !!!!!!

Neuigkeiten: Habe gerade gemerkt, dass das ganze von der Anzahl der Suchergebnisse abhängt (hätte ich nicht gedacht). Ich habe nach "Seite" gesucht, weil ich zum Testen gleich im ersten Datensatz dieses Wort gefunden hatte. Das kommt natürlich sehr häufig vor. Suche ich nach einen "echten" Begriff, dauert es 0,01 Sekunden.

Ich könnte also "blöde Suchanfragen" über einen COUNT abfangen und dann eine Meldung ausgeben "Suche zu ungenau" oder sowas oder in diesem Falle nur in der Bezeichnung suchen oder so.

Wäre zwar nicht soooo schön aber so könnte ich mich retten.

Trotzdem werde ich weiter Eure Tipps verfolgen... Ich wrede berichten
olruebe01
 2007-01-13 17:39
#35097 #35097
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
@ Strat: Ich aktualisiere die DB ein mal nachts. Danach ändert sich 24 Stunden nichts.
Verstehe ich das richtig: Ich erstelle EIN MAL einen View, der sortiert wird und suche dann nur noch in dem VIEW anstatt n der Tabelle???

EDIT: Meine mysql-Version ist zu alt :-( Kennt VIEW nicht\n\n

<!--EDIT|olruebe01|1168703088-->
pq
 2007-01-14 19:01
#35098 #35098
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,13.01.2007, 10:40]Zum schneller machen: das ORDER BY muss ueber alle zeilen gehen, und eine Menge an Vergleichen ausfuehren, was einfach Zeit dauert.[/quote]
naja, nicht unbedingt ueber alle zeilen. wenn ein index auf der order-
spalte ist und man ein LIMIT x gesetzt hat. da erkennt mysql schon
voher, wenn die ersten x ergebnisse gefunden wurden.
deshalb wundert es mich, dass es so langsam ist.

evtl. lohnt sich der einsatz einer search-engine statt datenbank
für solche suchen.

olruebe01: welche mysql-version hast du?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2007-01-14 19:09
#35099 #35099
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=olruebe01,13.01.2007, 16:26]Ich könnte also "blöde Suchanfragen" über einen COUNT abfangen und dann eine Meldung ausgeben "Suche zu ungenau" oder sowas oder in diesem Falle nur in der Bezeichnung suchen oder so.[/quote]
eigentlich gibt dir EXPLAIN (= DESCRIBE?) auch aus, wieviele zeilen
gefunden werden und dann per hand weiter dursucht werden.
aber evtll. ist das nicht so bei fulltext-indizes, keine ahnung.
jedenfalls kann man EXPLAIN durchaus anwenden, wenn es
diese information ausgibt; also zuerst ein EXPLAIN ausführen,
gucken, ob 1 mio. zeilen oder doch nur 1000 duchsucht werden müssen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2007-01-15 01:40
#35100 #35100
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ich möchte an dieser Stelle gerne nochmal einschieben, dass vielleicht
ein wenig Parametisierung helfen kann. Für die Sortierung legt MySQL sehr
wahrscheinlich eine temporäre Tabelle an (RAM). Wenn diese Tabelle einen
gewissen Wert übersteigt (tmp_table_size), wird sie auf die Festplatte
ausgelagert, was den Vorgang erheblich verlangsamen kann.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 10 Einträge, 1 Seite



View all threads created 2007-01-13 01:18.