sql >> Database teknologi >  >> RDS >> Mysql

MySQL:hvordan man indekserer en OR-klausul

Den typiske måde at opdele OR på prædikater er med UNION .

Bemærk, at dit eksempel ikke passer godt til dine indekser. Også selvom du har udeladt field1 fra prædikatet ville du have field2 >= 1000 OR field3 >= 2000 , som ikke kan bruge et indeks. Hvis du havde indekser på (field1, field2) og (field1,field3) eller field2 eller field3 separat, ville du få en rimelig hurtig forespørgsel.

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

Bemærk, at du skal angive et alias for den afledte tabel, hvorfor underforespørgslen er aliasset som T .

Et eksempel fra den virkelige verden. Kolonne- og tabelnavne er blevet anonymiseret!

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. Sådan viser du filer i en mappe med SQL Server

  2. Forebyggelse af SQL-injektion i C

  3. JDBC Oracle - Hent forklaringsplan for forespørgsel

  4. Find ud af, hvilken partition en given værdi ville være knyttet til i SQL Server (T-SQL)