Покрывающие индексы, охватывающие две таблицы - PullRequest
0 голосов
/ 10 марта 2020

Можно ли создать покрывающие индексы, которые охватывают таблицы? Предположим, я хочу оптимизировать этот запрос:

SELECT tbl1.col1,
       tbl2.col2
  FROM tbl1 INNER JOIN
       tbl2 ON tbl1.col1 = tbl2.col1
 WHERE tbl1.col3 = ... 

Поможет ли создание этих индексов?

INDEX (col3, col1) -- tbl1's
INDEX (col1, col2) -- tbl2's 

1 Ответ

0 голосов
/ 11 марта 2020

Предполагая, что это полный запрос ...

SELECT  a.col1, b.col2
    FROM  tbl1 AS a
    INNER JOIN  tbl2 AS b  ON a.col1 = b.col1
    WHERE  a.col3 = constant

Анализ:

Из-за предложения Where сначала будет рассматриваться tbl1, и это будет быть оптимальным индексом:

INDEX(col3, col1) == handles the WHERE, plus it is "covering"

Тогда для вложенного L oop Соединения в tbl2 потребуется индекс, начинающийся с col:

INDEX(col1, col2) -- again "covering"

См. также http://mysql.rjweb.org/doc.php/index_cookbook_mysql

Заголовок («... охватывают две таблицы») обманчив. Ни один из этих индексов не включает более одной таблицы. INDEX(col2, col3) невозможно, поскольку в нем задействовано более одной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...