sql >> Database >  >> RDS >> Mysql

MySQL:hoe een OR-clausule te indexeren

De typische manier om OR . uit elkaar te halen predikaten is met UNION .

Merk op dat uw voorbeeld niet goed past bij uw indexen. Zelfs als je field1 hebt weggelaten van het predikaat zou je field2 >= 1000 OR field3 >= 2000 . hebben , die geen index kan gebruiken. Als u indexen had op (field1, field2) en (field1,field3) of field2 of field3 afzonderlijk zou je een redelijk snelle vraag krijgen.

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

Houd er rekening mee dat u een alias moet opgeven voor de afgeleide tabel, daarom heeft de subquery een alias als T .

Een praktijkvoorbeeld. Kolom- en tabelnamen zijn geanonimiseerd!

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)


  1. Willekeurige waarde voor kolom DATETIME

  2. Hoe Array/Table Parameter te gebruiken voor Oracle (ODP.NET 10g) via ADO.NET/C#?

  3. Logboekregistratie van trage query's (Slow Query-logboek) in MySQL-database inschakelen

  4. Twee SQL LEFT JOINS produceren een onjuist resultaat