У меня есть представление, что запросы из 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 и использовать его вместо этого?
2 ответа
Вообще говоря, алгоритм MERGE
является предпочтительным, поскольку он позволяет вашему представлению использовать индексы таблиц и не создает задержки при создании временных таблиц (как это делает TEMPTABLE
).
Фактически это то, что оптимизатор MySQL делает по умолчанию - когда алгоритм представления UNDEFINED
(как это по умолчанию) MySQL будет использовать MERGE
, если может, иначе он будет использовать TEMPTABLE
,
Стоит отметить (что доставило мне много боли), что MySQL не будет использовать алгоритм MERGE
, если ваше представление содержит любая из следующих конструкций:
Конструкции, предотвращающие слияние, одинаковы для производных таблиц и ссылок на представления:
Агрегатные функции (SUM (), MIN (), MAX (), COUNT () и т. д.)
Distinct р >
GROUP BY
HAVING р >
ПРЕДЕЛ р >
СОЮЗ или СОЮЗ ВСЕХ
Подзапросы в списке выбора
Назначения пользовательских переменных
Ссылки только на литеральные значения (в данном случае нет базовой таблицы)
В этом случае будет использоваться TEMPTABLE
, что может привести к проблемам с производительностью без четкой причины. В этом случае лучше использовать хранимую процедуру или подзапрос вместо представления
Спасибо, MySQL 😠
Какой алгоритм? Это зависит от конкретного запроса и схемы. Обычно оптимизатор выбирает лучший подход, и вы не должны указывать.
Но ... Иногда оптимизатор выбирает действительно плохой подход. В этот момент единственное реальное решение - не использовать Views. То есть некоторые представления не могут быть оптимизированы так же, как и эквивалентные SELECT
.
Если вы хотите обсудить конкретный случай, укажите SHOW CREATE VIEW
и SHOW CREATE TABLEs
, а также SELECT
, вызывающий представление. И создайте эквивалент SELECT
. Также включите EXPLAIN
для обоих SELECTs
.
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.