У меня есть представление, что запросы из 2 таблиц, которые не меняются часто (они обновляются один или два раза в день) и имеют максимум 2000 и 1000 строк).

Какой алгоритм должен работать лучше, MERGE или TEMPTABLE?

Интересно, MySQL кеширует результат запроса, делая TEMPTABLE лучшим выбором в моем случае?

Чтение https://dev.mysql.com/doc/refman/ 5.7 / en / view -gorithms.html Я понял, что в основном алгоритм MERGE внедрит код представления в запрос, который его вызывает, а затем запустится. Алгоритм TEMPTABLE сначала запускает представление, затем сохраняет его результат во временной таблице. Но нет упоминания о кеше.

Я знаю, что у меня есть возможность самостоятельно реализовывать материализованные представления (http://www.fromdual.com/mysql). -materialized - просмотров ) . Может ли MySQL автоматически кэшировать результат TEMPTABLE и использовать его вместо этого?

14
Paulo Amaral 28 Фев 2017 в 19:20

2 ответа

Лучший ответ

Вообще говоря, алгоритм MERGE является предпочтительным, поскольку он позволяет вашему представлению использовать индексы таблиц и не создает задержки при создании временных таблиц (как это делает TEMPTABLE).

Фактически это то, что оптимизатор MySQL делает по умолчанию - когда алгоритм представления UNDEFINED (как это по умолчанию) MySQL будет использовать MERGE, если может, иначе он будет использовать TEMPTABLE ,

Стоит отметить (что доставило мне много боли), что MySQL не будет использовать алгоритм MERGE, если ваше представление содержит любая из следующих конструкций:

Конструкции, предотвращающие слияние, одинаковы для производных таблиц и ссылок на представления:

  • Агрегатные функции (SUM (), MIN (), MAX (), COUNT () и т. д.)

  • Distinct

  • GROUP BY

  • HAVING

  • ПРЕДЕЛ

  • СОЮЗ или СОЮЗ ВСЕХ

  • Подзапросы в списке выбора

  • Назначения пользовательских переменных

  • Ссылки только на литеральные значения (в данном случае нет базовой таблицы)

В этом случае будет использоваться TEMPTABLE, что может привести к проблемам с производительностью без четкой причины. В этом случае лучше использовать хранимую процедуру или подзапрос вместо представления

Спасибо, MySQL 😠

9
Community 20 Июн 2020 в 09:12

Какой алгоритм? Это зависит от конкретного запроса и схемы. Обычно оптимизатор выбирает лучший подход, и вы не должны указывать.

Но ... Иногда оптимизатор выбирает действительно плохой подход. В этот момент единственное реальное решение - не использовать Views. То есть некоторые представления не могут быть оптимизированы так же, как и эквивалентные SELECT.

Если вы хотите обсудить конкретный случай, укажите SHOW CREATE VIEW и SHOW CREATE TABLEs, а также SELECT, вызывающий представление. И создайте эквивалент SELECT. Также включите EXPLAIN для обоих SELECTs.

4
Rick James 1 Мар 2017 в 19:22