Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:как да индексираме клауза ИЛИ

Типичният начин за разделяне на OR предикатите са с UNION .

Имайте предвид, че вашият пример не пасва добре на вашите индекси. Дори ако сте пропуснали field1 от предиката ще имате field2 >= 1000 OR field3 >= 2000 , който не може да използва индекс. Ако сте имали индекси на (field1, field2) и (field1,field3) или field2 или field3 отделно ще получите сравнително бърза заявка.

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

Имайте предвид, че трябва да предоставите псевдоним за извлечената таблица, поради което подзаявката е с псевдоним като T .

Пример от реалния свят. Имената на колони и таблици са анонимни!

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. PHP:защо не мога да завъртя два пъти на резултатите от mysqli_fetch_array()?

  2. MySQL:как да получите x брой резултати на групиране

  3. Единични кавички, двойни кавички и обратни цитати в MySQL заявки

  4. PDO грешка:SQLSTATE[HY000]:Обща грешка:2031

  5. MySQL:Как да получите дължината на текста в колона