Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:jak indeksować klauzulę OR

Typowy sposób na rozbicie OR predykaty są z UNION .

Zauważ, że twój przykład nie pasuje do twoich indeksów. Nawet jeśli pominąłeś field1 z predykatu masz field2 >= 1000 OR field3 >= 2000 , który nie może używać indeksu. Gdybyś miał indeksy na (field1, field2) i (field1,field3) lub field2 lub field3 osobno otrzymasz dość szybkie zapytanie.

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

Zauważ, że musisz podać alias dla tabeli pochodnej, dlatego podzapytanie ma alias T .

Przykład z prawdziwego świata. Nazwy kolumn i tabel zostały zanonimizowane!

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj datę z rrrr-mm-dd na dd nazwa_miesiąca rok

  2. Jak dołączyć do 3 tabel INNER JOIN za pomocą CodeIgniter

  3. Wstawić wiele plików tekstowych rozdzielanych tabulatorami do MySQL za pomocą Pythona?

  4. Jak wykonać zapytanie o pola zawierające dany tekst w MySQL?

  5. Serwer MySQL zabrakło pamięci lub się nie uruchamia