Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :comment indexer une clause OR

La façon typique de décomposer OR les prédicats sont avec UNION .

Notez que votre exemple ne correspond pas bien à vos index. Même si vous avez omis field1 à partir du prédicat, vous auriez field2 >= 1000 OR field3 >= 2000 , qui ne peut pas utiliser d'index. Si vous aviez des index sur (field1, field2) et (field1,field3) ou field2 ou field3 séparément, vous obtiendrez une requête raisonnablement rapide.

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

Notez que vous devez fournir un alias pour la table dérivée, c'est pourquoi la sous-requête est aliasée en tant que T .

Un exemple concret. Les noms de colonnes et de tables ont été anonymisés !

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)