Как правильнее создать идею «материализованного представления» в MySQL/MariaDB?
Добрый день, имеется база данных MariaDB, внутри которой есть множество баз различной сложности, каждая база отвечает за свой род информации, примем как за факт, что ввиду сложности баз и информации, созданные views отображающих ту или иную информацию, но представления по скорости получаются тяжелыми, некоторые 5 сек выполняются, другие 10 и т.п. Вроде как для создания может какой то отчётности не критично, но сейчас появилась задача что нужно определенную информацию из views быстро выводить, и давать поиск по ней.
В голову приходит только самое простое решение, это по расписанию делать копию данных views в таблицу
И тут скорее больше вопрос как это лучше сделать, как устроен mysql. А именно, если например одна вьюха выполняется 30 секунд, т.е. я хочу уже в имеющуюся по структуре таблицу сначала TRUNCATE потом INSERT значения из вьюхи, в этот момент, когда идёт эта долгая копирка данных, как себя чуствует mysql, он спокойно принимает другие запросы, и особо ничего сложно не чуствует (т.е. скорость работы других запросов ощутимо, или нисколько даже не падает, единственное что коннект один на долго забирается)
И сразу вопрос, если у меня например таких 5 баз, в каждой по 5 views, наверное совсем не правильно их шелдулирить все в один момент, как правильнее, создать какую то одну процедуру, которая по очередно будет TRUNCATE+INSERT, TRUNCATE+INSERT,...
Или также в зависимости от необходимой актуальности данных, ещё каждую процедуру как то назвать аля EVERY_HOUR, EVERY_DAY и помещать туда нужные вьюхи.
Больше вопрос интересуют, как себя база данных чувствует в такие запуски
лучше часть этого представления "материализовать" на стороне клиента (закешировать всё, что можно назвать словариками. Или обеспечить им ленивую загрузку/загрузку по требованию), а собственно, во вьюшке оставить только те поля, по которым нужен поиск. Ну и оптимизировать БД (навесить индексы), если это ещё не делалось. Можно также попробовать переделать представления поиграв различными способами запросов, посмотреть насколько быстро они выполняются.
Все очень зависит от того, где узкое место. При больших объемах лучше обновлять не всю таблицу, а только то, что изменилось, например, по таблице логов. Опять же, все это имеет смысл при тяжелых операциях с данными, которые не выгодно выполнять при каждом запросе.
Жалко, конечно, что в MySQL материализованные представления не работают из коробки, поэтому придется все делать самому.