Ich habe bei der Optimierung meiner SQL-Statements mehrmals gelesen, dass man auf IN-Statements verzichten sollte. IN-Statements lassen sich sehr einfach mit INNER JOINs nachbilden.

Folgender Vergleich spricht für sich:

IN-Statement

mysql> SELECT NULL , anzahl, 1, 2, 3, 12, 21, NULL FROM
-> (SELECT COUNT( id ) AS anzahl FROM
-> (SELECT z.r_id AS id FROM zahlen z
-> INNER JOIN zeitpunkte t ON z.r_id = t.r_id
-> AND t.datum >= DATE_SUB( CURDATE( ) , INTERVAL 10 YEAR )
-> AND 1 IN (SELECT zahl FROM zahlen z1 WHERE z.r_id = z1.r_id)
-> AND 2 IN (SELECT zahl FROM zahlen z2 WHERE z.r_id = z2.r_id)
-> AND 3 IN (SELECT zahl FROM zahlen z3 WHERE z.r_id = z3.r_id)
-> AND 12 IN (SELECT zahl FROM zahlen z4 WHERE z.r_id = z4.r_id)
-> AND 21 IN (SELECT zahl FROM zahlen z5 WHERE z.r_id = z5.r_id)

-> GROUP BY z.r_id
-> ) auswahl
-> ) auswertung
-> WHERE anzahl <> 0;
+——+——–+—+—+—+—-+—-+——+
| NULL | anzahl | 1 | 2 | 3 | 12 | 21 | NULL |
+——+——–+—+—+—+—-+—-+——+
| NULL |      1 | 1 | 2 | 3 | 12 | 21 | NULL |
+——+——–+—+—+—+—-+—-+——+
1 row in set (0.05 sec)

——– Original-Nachricht ——–

Betreff: Cron ksh /root/lotto/script_lotto_statistik.sh
Datum: Thu, 20 Oct 2011 00:50:01 +0200 (CEST)
Von: root@localhost (Cron Daemon)
An: root@localhost

Start statistik.sql INSERT Thu Oct 20 00:50:01 CEST 2011

Ende Thu Oct 20 03:00:44 CEST 2011

 

INNER JOIN

mysql> SELECT NULL , anzahl, 1, 2, 3, 12, 21, NULL
-> FROM (SELECT COUNT( id ) AS anzahl FROM
-> (SELECT z.r_id AS id FROM zahlen z
-> INNER JOIN zeitpunkte t ON z.r_id = t.r_id
-> AND t.datum >= DATE_SUB( CURDATE( ) , INTERVAL 10 YEAR )
-> INNER JOIN zahlen z1 ON z.r_id = z1.r_id AND z1.zahl = 1

-> INNER JOIN zahlen z2 ON z.r_id = z2.r_id AND z2.zahl = 2
-> INNER JOIN zahlen z3 ON z.r_id = z3.r_id AND z3.zahl = 3
-> INNER JOIN zahlen z4 ON z.r_id = z4.r_id AND z4.zahl = 12
-> INNER JOIN zahlen z5 ON z.r_id = z5.r_id AND z5.zahl = 21

-> GROUP BY z.r_id
-> ) auswahl
-> ) auswertung
-> WHERE anzahl <> 0;
+——+——–+—+—+—+—-+—-+——+
| NULL | anzahl | 1 | 2 | 3 | 12 | 21 | NULL |
+——+——–+—+—+—+—-+—-+——+
| NULL |      1 | 1 | 2 | 3 | 12 | 21 | NULL |
+——+——–+—+—+—+—-+—-+——+
1 row in set (0.00 sec)

——– Original-Nachricht ——–

Betreff: Cron ksh /root/lotto/script_lotto_statistik.sh
Datum: Sun, 23 Oct 2011 00:50:01 +0200 (CEST)
Von: root@localhost (Cron Daemon)
An: root@localhost

Start statistik.sql INSERT Sun Oct 23 00:50:01 CEST 2011

Ende Sun Oct 23 01:37:49 CEST 2011

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Bitte als Captcha folgende Aufgabe lösen: * Time limit is exhausted. Please reload CAPTCHA.