sql >> Databasteknik >  >> RDS >> Mysql

MySQL:hur man indexerar en OR-klausul

Det typiska sättet att dela upp OR predikat är med UNION .

Observera att ditt exempel inte passar bra med dina index. Även om du har utelämnat field1 från predikatet skulle du ha field2 >= 1000 OR field3 >= 2000 , som inte kan använda ett index. Om du hade index på (field1, field2) och (field1,field3) eller field2 eller field3 separat skulle du få en ganska snabb fråga.

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

Observera att du måste tillhandahålla ett alias för den härledda tabellen, vilket är anledningen till att underfrågan har alias som T .

Ett verkligt exempel. Kolumn- och tabellnamn har anonymiserats!

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. Generera PL/SQL-procedur online för att importera data i Oracle Table

  2. Rails Migration:Bigint på PostgreSQL verkar misslyckas?

  3. Det går inte att ändra rubrikinformation

  4. Laravel SQLSTATE[22007]:Ogiltigt datetime-format:1292 Felaktigt datetime-värde:'2019-03-10 02:00:39' för kolumnen 'updated_at' (sommartid?)