MySQL запрос с оптимизацией OR - PullRequest
0 голосов
/ 11 мая 2011

Можно ли оптимизировать следующий запрос?Какие индексы можно создать?

SELECT column_a 
  FROM Table_b 
  JOIN Table_a
 WHERE Table_B.ID_b = Table_A.ID_a 
    OR Table_B.ID_b = Table_A.ID_b;

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Ваш запрос на самом деле должен быть:

SELECT column_a 
  FROM Table_b 
  JOIN Table_a ON Table_B.ID_b IN (Table_A.ID_a, Table_A.ID_b)

Если вы не предоставляете критерии ON с JOIN, MySQL принимает это как CROSS JOIN - результат - декартово произведение (это плохоЕсли только это действительно то, что вы хотите).Если бы я знал, из какой таблицы пришло column_a, я мог бы предложить другой подход к запросу ...

Индексировать следующее:

  • Table_B.ID_b
  • Table_A.ID_a
  • Table_A.ID_b

Два столбца в TABLE_A могут быть индексом покрытия, а не отдельными.

0 голосов
/ 11 мая 2011

Если поля ID_x являются ключами (первичными или уникальными), это уже должно быть довольно хорошо. (То есть, если это не так, вы должны убедиться, что все поля, затронутые частью WHERE, проиндексированы.)

Рассмотрите возможность размещения EXPLAIN запроса:

EXPLAIN SELECT column_a FROM Table_b JOIN Table_a
WHERE Table_B.ID_b = Table_A.ID_a OR Table_B.ID_b = Table_A.ID_b;

Из комментариев:

| id | select_type | table   | type  | possible_keys                               | key           | key_len | ref  | rows     | Extra                                            |
| 1  | SIMPLE      | Table_b | index | INDEX_ON_ID_b                               | INDEX_ON_ID_b | 3       | NULL | 1507     | Using index; Using temporary                     |
| 1  | SIMPLE      | Table_a | ALL   |ID_a,ID_b,ID_a_column_a, ID_b_column_a_index | NULL          | NULL    | NULL | 29252089 | Range checked for each record (index map: 0x306) |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...