Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:wie man eine OR-Klausel indiziert

Die typische Art, OR aufzubrechen Prädikate ist mit UNION .

Beachten Sie, dass Ihr Beispiel nicht gut zu Ihren Indizes passt. Auch wenn Sie field1 weggelassen haben aus dem Prädikat hätten Sie field2 >= 1000 OR field3 >= 2000 , die keinen Index verwenden kann. Wenn Sie Indizes auf (field1, field2) hatten und (field1,field3) oder field2 oder field3 separat erhalten Sie eine recht schnelle Abfrage.

SELECT COUNT(*) FROM
(SELECT * FROM table WHERE field1 = 'value' AND field2 >= 1000
UNION
SELECT * FROM table WHERE field1 = 'value' AND field3 >= 2000) T

Beachten Sie, dass Sie einen Alias ​​für die abgeleitete Tabelle angeben müssen, weshalb die Unterabfrage als T aliased wird .

Ein Beispiel aus der Praxis. Spalten- und Tabellennamen wurden anonymisiert!

mysql> SELECT COUNT(*) FROM table;
+----------+
| COUNT(*) |
+----------+
|  3059139 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM table WHERE columnA = value1;
+----------+
| COUNT(*) |
+----------+
|     1068 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM table WHERE columnB = value2;
+----------+
| COUNT(*) |
+----------+
|      947 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM table WHERE columnA = value1 OR columnB = value2;
+----------+
| COUNT(*) |
+----------+
|     1616 |
+----------+
1 row in set (9.92 sec)

mysql> SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION SELECT * FROM table WHERE columnB = value2) T;
+----------+
| COUNT(*) |
+----------+
|     1616 |
+----------+
1 row in set (0.17 sec)

mysql> SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION ALL SELECT * FROM table WHERE columnB = value2) T;
+----------+
| COUNT(*) |
+----------+
|     2015 |
+----------+
1 row in set (0.12 sec)