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