phpbar.de logo

Mailinglisten-Archive

mehr Geschwindigkeit durch andere formulierung ?

mehr Geschwindigkeit durch andere formulierung ?

IT - Sven Mueller sven.mueller at berndes.com
Mon Jan 20 18:41:12 CET 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Monday 20 January 2003 18:17, Henning Jödden wrote:
> 1 row in set (5.18 sec)
>
> hat mir MySQL auf diese Query geantwortet:
> mysql> SELECT COUNT(c.c_email) FROM t_contestants=c,
> t_client_group_data=g WHERE c.c_id=g.c_id AND c.c_delete='FALSE' AND
> g.ev_id='5' AND g.c_rollback IS NULL;
>
> Ich habe mehrere Query-Konstrukte probiert (mit und ohne aliase, mit
> JOIN, ohne COUNT und rows zählen usw.) wovon diese aber die schnellste
> ist.
> Allerdings kommen mir 5.18 Sek. trotzdem verdammt lang vor.
>
> Kann man diese Query noch irgendwie anders schreiben um schneller zum
> selben Ergebnis zu kommen ?

Generell:
1. Lege einen Index über die am häufigsten gefragten Spalten
2. Frage bei der obigen "AND" Verknüpfung erst (zeitlich, s.u.) die
   indizierten Spalten ab.
3. Innerhalb der indizierten bzw. nicht indizierten Spalten solltest Du so
   sortieren, dass Du die Suche möglichst schnell einschränkst.
Beispiel:
Angenommen g.ev_id wäre aus dem Bereich 1-5 und gleichverteilt (also Wert '5' 
mit einer Wahrscheinlichkeit von 20%). Zudem sei c.c_delete für nur 10% der 
Zeilen 'FALSE'. Dann solltest Du zuerst c.c_delete abfragen, und dann erst 
g.ev_id.
Aber Vorsicht: Ich kann mich noch vage erinnern, dass Sybase und Oracle die 
Ausdrücke in zueinander umgekehrter Reihenfolge auswerteten (der eine die 
vorne stehenden Terme zuerst, der andere die hinten Stehenden). Ich weiss 
nicht, in welcher Reihenfolge MySql auswertet, ich vermute aber von links 
nach rechts.
Diese Sortierung bringt je nach Datenbank, Zahl der Zeilen, Art des 
Datenbankformats und den verwendeten Indizes sowie natürlich Beschaffenheit 
der Daten mal über 80% Ersparnis und mal unter 10%. Probier es halt aus.

Aber wenn ich überlege, dass Du vermutlich über 60000 Datensätze in der Query 
abgefragt hast, und darin immerhin 4 Tests verwendest, dann finde ich die 5 
Sekunden je nach Hardware gar nicht so schlecht.

Wenn Du konkretere Hinweise haben willst, solltest Du angeben:
- - Die Tabellenstruktur der beiden verwendeten Tabellen (inklusive Indizes)
- - Die Zahl der Datensätze in den Tabellen
- - eine kurze Beschreibung der Daten (z.B. ist c.c_delete meistens TRUE oder
  FALSE?)
- - Hardware-Voraussetzungen (CPU, Hauptspeicher, Festplatten, Raid?)
- - CPU-Auslastung während des Tests (vor allem die durch andere Prozesse)
- - MySQL-Version

Regards,

Sven Müller
- - IT - Network&Infrastructure -

- -- 
* Heinrich Berndes Haushaltstechnik GmbH & Co KG
* Wiebelsheidestrasse 55, 59757 Arnsberg, Germany
* Phone: +49 2932 475-282 / FAX: -325
* http://www.berndes.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+LDS4ss2fOBI6SZ0RAvpcAKCapIU6Yl2GnR6cOy6sj+qXenapSACgiyK1
mTOZaZSgdrpr1iK+vuaIOfc=
=WnGk
-----END PGP SIGNATURE-----

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive