sql >> Databáze >  >> RDS >> Mysql

MySQL:jak indexovat klauzuli OR

Typický způsob, jak rozdělit OR predikáty jsou s UNION .

Všimněte si, že váš příklad dobře nezapadá do vašich indexů. I když jste vynechali field1 z predikátu byste měli field2 >= 1000 OR field3 >= 2000 , který nemůže používat index. Pokud jste měli indexy na (field1, field2) a (field1,field3) nebo field2 nebo field3 samostatně byste dostali přiměřeně rychlý dotaz.

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

Všimněte si, že musíte zadat alias pro odvozenou tabulku, což je důvod, proč je poddotaz označen jako T .

Příklad z reálného světa. Názvy sloupců a tabulek byly anonymizovány!

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. Python 3.7, Selhalo stavební kolo pro MySql-Python

  2. Nestrukturovaný obsah:Nevyužitý zdroj paliva pro umělou inteligenci a strojové učení

  3. ROUND(datum) Funkce v Oracle

  4. Vložit do výběru a aktualizovat v jediném dotazu