Mailinglisten-Archive |
-----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