Подтвердить что ты не робот

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

Как реализовать материализованные представления?

Если нет, как я могу реализовать Materialized View с MySQL?

Update:

Будет ли следующая работа? Это не происходит в транзакции, это проблема?

DROP TABLE IF EXISTS `myDatabase`.`myMaterializedView`;
CREATE TABLE `myDatabase`.`myMaterializedView` SELECT * from `myDatabase`.`myRegularView`;
4b9b3361

Ответ 1

Я поддерживаю проект под названием Flexviews (http://github.com/greenlion/swanhart-tools), который добавляет постепенно обновляемые материализованные представления в MySQL (например, быстрое обновление), даже для просмотров которые используют объединения и агрегацию. Я работаю над этим проектом уже три года. Он включает утилиту для сбора данных изменений, чтобы читать журналы базы данных. Триггеры не используются.

Он включает в себя два метода обновления. Первое похоже на ваш метод, за исключением создания новой версии, а затем RENAME TABLE используется для замены нового для старого. Ни в коем случае это представление недоступно для запросов, но 2x пространство используется на короткое время.

Второй метод - это "быстрое обновление", он даже поддерживает агрегацию и объединение.

Об этом сообщается в блоге: http://www.mysqlperformanceblog.com/2011/04/04/flexviews-part-3-improving-query-performance-using-materialized-views/

Flexviews значительно более продвинутый, чем пример FromDual, на который ссылается наблюдатель.

Ответ 2

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

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

Кроме того, рассмотрите возможность использования переименования таблиц, а не drop/create, чтобы новый вид можно было построить и внедрить с почти отсутствием недоступности. Сначала создайте новую таблицу "mview_new", затем переименуйте "mview" в "mview_old" (или отпустите) и переименуйте "mview_new" в "mview". В приведенном выше примере ваше представление будет недоступно, пока ваш SQL-заполнитель запущен.

Ответ 3

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