Schrift
[thread]3490[/thread]

MySQL Datenbank-Abfrage Arsch-langsam...



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
[HR]Doomrunner
 2004-08-02 22:52
#32481 #32481
User since
2003-09-04
77 Artikel
BenutzerIn
[default_avatar]
Hi,

ich habe eine MySQL-Tabelle in einer Datenbank, die ca. 500.000 Datensätze hat (sie ist ca. 150MB) groß.

Wenn ich jetzt einfach nur wissen will, wieviele Treffer ich bekomme, wenn ich nach nem bestimmten String suche, dann dauert das ne halbe Ewigkeit (Teilweise sogar Minuten)...

Mache das ganz einfach über folgenden Code:

Code (perl): (dl )
1
2
3
4
5
6
# Anzahl der Zeilen einlesen:
    my $sql = qq{ SELECT id FROM unternehmensdb $filter $order };
    my $sth = $dbh->prepare( $sql ); 
    $sth->execute();
    my $anzahl = $sth->rows;
    $sth->finish();


$filter und $order sind natürlich vorher definiert...

Weiß einer woran das liegt, bzw. wie ich das beschleunigen kann?!

thx,
Doomrunner

Wenn ich zum Beispiel eine Abrage via phpmyadmin mache, dann dauert die gerademal 1-2 Sekunden... Also kann es ja definitiv nicht an der mysql-db liegen.\n\n

<!--EDIT|
Doomrunner|1091473063-->
jan
 2004-08-02 22:58
#32482 #32482
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
was enthalten denn $filter und $order?
ptk
 2004-08-02 23:00
#32483 #32483
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es ist besser, wenn du die Datenbank zaehlen laesst, also
Code: (dl )
SELECT Count(*) FROM ...
verwendest. Ansonsten das Uebliche: Indices verwenden und hoffen, dass es damit auch schneller geht. Manchmal kann man aus der Ausgabe von
Code: (dl )
EXPLAIN SELECT ...
(in der mysql-Kommadozeile eingeben) erkennen, wie aufwaendig eine Abfrage wird.
[HR]Doomrunner
 2004-08-02 23:01
#32484 #32484
User since
2003-09-04
77 Artikel
BenutzerIn
[default_avatar]
die enthalten einfach nur die Suchbegriffe, bzw. die Sortierreihenfolge. Ne Möglichkeit für den Suchstring wäre also z.B.:

Code (perl): (dl )
SELECT id FROM unternehmensdb WHERE firma LIKE 'a' ORDER BY 'firma'
jan
 2004-08-02 23:04
#32485 #32485
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
mh, ist nicht LIKE eine regexp-suche? oder schaltet mysql den regexp-mode nur ein, wenn man specialchars benutzt? wenn LIKE immer als regexp arbeitet, dann würde das erklären, warum es ein bisschen dauert...

was läuft denn eigentlich noch auf dem rechner?
[HR]Doomrunner
 2004-08-02 23:06
#32486 #32486
User since
2003-09-04
77 Artikel
BenutzerIn
[default_avatar]
Wie würde ich denn das

Code (perl): (dl )
SELECT Count(*) FROM ...


genau in meinen Quellcode einbinden um darüber die Anzahl zu bestimmen?
ptk
 2004-08-02 23:08
#32487 #32487
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Etwa so:
Code: (dl )
my($anzahl) = $sth->fetchrow_array;
ptk
 2004-08-02 23:11
#32488 #32488
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=jan,02.08.2004, 21:04]mh, ist nicht LIKE eine regexp-suche? oder schaltet mysql den regexp-mode nur ein, wenn man specialchars benutzt? wenn LIKE immer als regexp arbeitet, dann würde das erklären, warum es ein bisschen dauert...[/quote]
LIKE ist eher ein Arme-Leute-Regexp --- man kann nur ".*" und "(?:i)" spezifizieren. Es gibt aber auch einen REGEXP-Operator bei MySQL. Ein Ausdruck mit LIKE wird auf jeden Fall langsam, wenn "%" am Anfang steht, ansonsten hat man eine kleine Chance, dass der Index konsultiert werden kann.
renee
 2004-08-03 00:29
#32489 #32489
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn man nicht wirklich Wildcards benutzt, sollte man = statt LIKE verwenden.
Und statt count(*) nimmt man besser count(spalte_aus_primary_key)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2004-08-03 03:56
#32490 #32490
Hi,

danke für eure Hilfe... Ist schon wesentlich (!) schneller geworden.

Benutze % Zeichen in meinen Aufrufen. Deshalb muss ich schon den Like Operator nutzen.
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2004-08-02 22:52.