Прежде всего, что я знаю:
Управление индексами полезно для повышения производительности магазина.
EAV
имеет один недостаток. он будет хранить данные в разных таблицах, так что получение данных занимает много времени.
Так что мы будем хранить данные в одной таблице. при изменении данных мы обновим эту таблицу (ничего, кроме обновления индексации)
mysql trigger
: выполнить некоторые действия запроса, основанные на вставке / обновлении / удалении таблицы.
Таким образом, magento использует триггер, например, когда цена обновляется, он будет сохранен entity_id
в таблице изменений.
в devdocs есть оператор для реализации триггеров с использованием magento2 Magento/Framework/Mview
.
Можете ли вы объяснить поток этой функциональности?
я имею в виду , что view
, action
, и processor
т.д.?
Mview
ссылается на материализованные представления , которыми являются таблицы индексов.Ответы:
В официальной документации: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html есть стемент:
MView расшифровывается как Materialized View, который представляет собой снимок базы данных в определенный момент времени. https://en.wikipedia.org/wiki/Materialized_view Зачем нам дублировать таблицы. Индексаторы обходятся дорого, особенно когда на страницах категорий есть трафик, клиенты размещают заказы, а администраторы сохраняют продукты. При сохранении продукта кеш становится недействительным (не по теме). В случае фондового индексатора, прежде чем он завершит выполнение, он отправляет идентификаторы сущностей, на которые влияют, как очищенные теги кэша (тип кэша полной страницы). В категории Magento 2.0 отправляются идентификаторы купленных продуктов. В Magento 2.1 отправляются идентификаторы продуктов.
Есть 2 таблицы MySQL, в которых хранятся коды и статусы индексатора:
indexer_state
mview_state
mview_state
работаетUpdate by Schedule
в Admin> Система> Управление индексаторамиUpdate by Schedule
заставляет индексаторы работать в cron.Есть 3 записи в
Magento_Indexer/etc/contab.xml
:indexer_reindex_all_invalid
работает наindexer_state
. По-прежнему необходимо запускать «нормальные» индексаторы в cronindexer_update_all_views
работает наmview_state
indexer_clean_all_changelogs
- очищает журналы изменений, используемыеmview_state
Обратите внимание , что групповые задания хрон индексатор запускается в отдельном процессе PHP, как заявлено в
etc/contab_groups.xml
:<use_separate_process>1</use_separate_process>
.Таблицы изменений:
[indexer name]_cl
(с суффиксом_cl
). напримерcataloginventory_stock_cl
. Если у вас установлены индексыUpdate by Schedule
и вы сохраняете продукт в админке, вы увидитеentity_id
этот продукт в этой таблице. Это большой круг, я думаю, разместить заказ или создать груз тоже добавит сюда запись.Кто-то привел пример в официальном devdoc о том, как создавать новые материализованные представления и какие методы интерфейса требуются (не обращайте внимания на приведенное выше утверждение о заказах в фрагменте ниже):
Это будет иметь смысл:
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode }
где$ids
параметр имеет идентификаторы сущностей из*_cl
таблиц.Какая связь между аннулированием кэша и индексаторами. Страницы категорий теперь полностью кэшируются (встроенный полный страничный кеш или через Varnish).
Есть
\Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview
:Вернуться к
Magento\Indexer\Cron\UpdateMview::execute()
:Magento\Indexer\Model\Processor::updateMview()
:В
app/etc/di.xml
есть:Magento\Framework\Mview\ViewInterface
app/etc/di.xml
В
Magento\Framework\Mview\View::update()
есть:Если вы ищете в
vendor/
каталоге,Magento\Framework\Mview\ActionInterface
вы найдете, например, это:В
\Magento\CatalogInventory\Model\Indexer
:В этом классе есть:
И похоже, что он восходит к «обычному» классу индексаторов - метод execute`, который используется MView.
О чистке кеша после Stock Indexer. Когда заказ размещается на кассе, количества вычитаются с помощью этого наблюдателя:
\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
Далее, другой наблюдатель запускает индексатор (но не напрямую в Mview / Indexer по расписанию):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
В случае Mview, когда вычитаются новые количества
SubtractQuoteInventoryObserver
, триггер MySQL (созданный для Mview) вставит строку вcataloginventory_stock_cl
, отмечая, что для этих идентификаторов приобретенного продукта необходимо выполнить переиндексацию (stock & fulltext). Для Mview создано множество триггеров MySQL. Увидеть их всех сSHOW TRIGGERS;
.Когда товара нет на складе после оформления заказа, вы увидите 2 строки, вставленные в эту таблицу (Magento сохраняет 2 товара на складе у этих 2 наблюдателей).
Когда cron запускает фондовый индексатор в режиме Mview, идентификаторы затронутых продуктов (в M2.1) или идентификаторы категорий (в M2.0) отправляются в кэш, очищенные как теги кеша. Под кешем я подразумеваю полный тип кеша страниц. Пример:
catalog_product_99
или другой формат тега кеша в зависимости от версии Magento. То же самое, когда Mview не включен.\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
А у Magento_PageCache есть обозреватель,
\Magento\PageCache\Observer\FlushCacheByTags
который будет очищать тэги типа кеша полной страницы. Это делает это для встроенного полного кеша страниц. Код, связанный с лаком, находится в\Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.Существует бесплатное расширение, которое будет запрещать очистку кэша еще на складе продуктов после проверки покупателем:
https://github.com/daniel-ifrim/innovo-cache-improve
Очистка кеша только на отсутствующих товарах после оформления заказа была введена в стандартную версию Magento 2.2.x. См
\Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.Я думаю, что выполнение cron для indexer in
Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
должно быть установлено на более чем 1 минуту.источник
mview.xml
Используется вместе сindexer.xml
для установки индексаторами.mview.xml
Файл объявляет:indexer.xml
Файл объявляет:Вы можете найти больше информации о декларации пользовательского индексатора здесь: Пользовательский индексатор на Magento2
Из того, что я понял, здесь есть две разные вещи:
Magento_Indexer
модуляMagento\Framework\Mview
которого эмулируется материализованное представление для MySQL с использованием триггеров.Вот небольшая информация из официальной документации
Типы индексации
Что касается рабочего процесса, то здесь для частичной переиндексации:
источник
Ссылка на документ Magento уже здесь, поэтому я пропускаю эту часть.
Magento реализовал материализованное представление в 2.0, которое отслеживает изменения для всех индексаторов. У каждого индексатора есть
_cl
таблица, которая получаетentity_id
иauto_increment
version_id
триггеры из основных таблиц.Когда выполняется задание cron, индексатор получает последний
version_id
для каждого представления изmview_state
таблицы и индексирует следующие доступные сущности в_cl
таблице.Переиндексация была головной болью до 1.9.xx и с огромным каталогом она всегда тормозила систему.
В Magento 2.0 индексатор обновляет только информацию об отдельных сущностях в таблицах индексатора, а не переиндексирует целые данные. Это держит мяч без замедления на сервере.
Примечание. Материализованное представление не поддерживается в mysql, поэтому в Magento оно управляется кодом PHP и работает аналогично представлению с материализацией, которое является функцией СУБД корпоративного уровня, например oracle.
источник