Как реализовать материализованный просмотр с помощью MySQL?
Как реализовать материализованные представления?
Если нет, как я могу реализовать Materialized View с MySQL?
Update:
Будет ли следующая работа? Это не происходит в транзакции, это проблема?
DROP TABLE IF EXISTS `myDatabase`.`myMaterializedView`;
CREATE TABLE `myDatabase`.`myMaterializedView` SELECT * from `myDatabase`.`myRegularView`;
Ответы
Ответ 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 и комментариями в нижней части страницы кажется, что люди создают представления, а затем создают таблицы из этих представлений, Не уверен, что это решение эквивалентно созданию материализованного представления, но, похоже, это единственный доступный в настоящее время доступ.