MySQL - Индекс не используется при просмотре - PullRequest
0 голосов
/ 27 марта 2020

Mysql: 5.7

У меня есть две таблицы, которые абсолютно одинаковой структуры. Индексы тоже одинаковые. Только другое имя таблицы. Я создал представление с этими двумя таблицами, как показано ниже.

CREATE ALGORITHM = MERGE VIEW TESTVW AS SELECT * FROM tableA UNION ALL SELECT * FROM tableB

Моя проблема

EXPLAIN SELECT * FROM TESTVW WHERE pk=3

enter image description here Там нет ни одного используемого индексы в этом результате (даже если в предложении where используются другие столбцы индекса). Может ли кто-нибудь помочь мне, что я не прав. Спасибо.

1 Ответ

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

Обработка VIEW недостаточно умна, чтобы положить sh WHERE в SELECTs из UNION. Запустите EXPLAIN, чтобы увидеть, что он выполняет UNION перед применением WHERE и что тогда нет доступных INDEX.

VIEW - это syntacti c sugar; они редко помогают производительности; иногда они болят. В этом случае это не больно. Больно то, что вы можете легко увидеть, как улучшить запрос; сбой оптимизатора.

Чтобы объяснить объяснение:

  • Запустите два SELECTs
  • UNION ALL их. (Это может иметь недавнюю оптимизацию, которая устраняет необходимость во временной таблице.)
  • Но все еще будет временная таблица.
  • Создание индекса (<auto-key>)
  • Посмотрите pk=3, используя этот индекс.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...