Так как другие уже ответили на ваши вопросы по специфике. Я подумал, что может быть лучше объяснить, зачем нужна индексация и как она связана с Magento и как она связана с современными базами данных .
Индекс: алфавитный список имен, предметов и т. Д. Со ссылками на места, где они встречаются, как правило, в конце книги.
Так что же такое индекс с точки зрения баз данных ?
Индекс - это структура данных, которая сортирует количество записей в одном или нескольких полях и ускоряет поиск данных. Это сделано для того, чтобы при поиске в базе данных не сканировать дисковые блоки, охватываемые таблицей.
И что такое индексирование с точки зрения Magento ? Побочный продукт EAV (Entity Attribute Value) AKA базы данных в базе данных. При наличии нескольких таблиц поиска сбор всех атрибутов, помеченных как проиндексированные, должен быть объединен в одну плоскую таблицу всех таблиц поиска для более быстрых запросов и сокращения операций ввода-вывода и циклов ЦП.
Я вспоминаю упоминание о том, что, когда Magento изначально разрабатывался, гибкость была высокой в списке приоритетов, и понятно, почему они решили использовать модель данных EAV. Однако, в конечном счете, цена такой гибкости повлияла на производительность, и это с самого начала преследовало Magento.
В общем, инженерам Magento было поручено, в первую очередь, создать максимально гибкую, настраиваемую систему из возможных, а потом беспокоиться о производительности. Почему Magento такой медленный?
EAV отлично подходит для хранилищ данных, но ужасен для транзакций. Итак, для чего нам нужны индексы для начала? Поскольку тот же подход реляционной модели был реализован, Magento теперь должен обрабатывать все, что MySQL делает сам внутри себя. Некоторые вещи, которые следует учитывать, такие как индексы, уже существующие в таблицах MySQL. Имея это в виду также, рассмотрим модель данных EAV сейчас:
- Е ntity = Таблица
- Ttribute = Поле
- V alue = значение
То же самое должно быть переопределено, что является очень «анти-шаблонным» ИМО.
Кроме того, по этой же причине вы обнаружите, var/locks
что индексатор использует блокировку процесса индексирования. По тем же причинам базы данных имеют блокировку строк / таблиц.
Теперь, когда запись, скажем, значение продукта было изменено, flat table
или index
(как то, что MySQL назвал бы это) нужно обновить, чтобы отразить запросы на вновь измененные данные, которые можно найти быстро и эффективно без сканирования многочисленных записей. Плоские таблицы существуют так, как они используются по той же причине, по которой они есть в MySQL, без такого индекса (например, книги) для получения записи требуется полное сканирование таблицы. Это означает огромное количество операций ввода-вывода как для диска и памяти, так и для циклов ЦП для определения местоположения запрошенных данных, что очень плохо сказывается на производительности.
Поскольку Magento использует модель данных EAV, существует множество справочных таблиц, которые необходимо отсканировать, чтобы собрать все данные вместе, чтобы найти запрошенные данные. Это то, что происходит, если вы отключите каталоги Flat. Точно так же, как MySQL, сканирование для записи против использования индекса (плоская таблица), который будет использоваться, чтобы быстро найти запись, сохраняя драгоценные циклы ввода / вывода. Создание таблицы и отсутствие добавления индексов - это то же самое, что и использование плоских таблиц в magento. Хотя эти два сценария могут хорошо работать в разных сценариях, см . Очень хороший ответ Бена в Сонасси на этот вопрос. (Подсказка подразумевает понимание объема данных.)
Хотя это и не является прямым ответом на ваш вопрос, понимание движущихся частей и лучшая подготовка к ним должны помочь облегчить некоторые из головных болей, возникающих при индексировании. « Лечить проблему, а не симптом ».
Изучение внутренних особенностей современных систем баз данных может помочь лучше понять, как и почему необходима индексация и как она (в некоторой степени) связана с индексацией Magento.
Подводя итог: поймите ваши проблемы, прежде чем вслепую применять решения. Поскольку не все биты данных будут одинаковыми, а планирование и внедрение решений ПОСЛЕ того, как у вас будет хорошее / полное понимание проблемы. Оптимизация базы данных может быть очень полезной для управления изменениями. Такие, как предотвращение страшного DEADLOCKS
.
Вы также можете рассмотреть возможность установки всех своих индексаторов Manual
и настройки альтернативных процессов для перестройки индекса в часы непиковой нагрузки (когда администраторы отсутствуют). Только так Product Prices
и Stock Status
должно быть установлено Update on Save
.
Теперь рассмотрим, как работает индексация с технической точки зрения. Основной модуль отвечает за индексацию Mage_Index
. Основные модели индексатор: Indexer
, Process
, Event
.
Mage_Index_Model_Indexer
является индексатором, все взаимодействия с другими модулями модуля Mage_Index
происходят через этот сервис. Он содержит следующие методы:
processEntityAction()
Создает и регистрирует событие и запускает процесс индексации.
logEvent()
Создает событие и регистрирует его для последующей индексации;
indexEvent()
Запускает события индексации;
getProcessesCollection()
Возвращает коллекцию всех процессов, таких как атрибуты продукта, цены продукта, перезапись URL-адресов каталога и т. Д. Обычно после изменения сущности, например, метода _afterSave
или _afterCommit
мы выполняем частичное переиндексацию.
Процесс Mage_Index_Model_Process
или - это сущность вашего индексатора, который хранит состояние, последнюю операцию запуска. Все процессы хранятся в таблице index_process
. В программе есть метод, getIndexer()
который возвращает индекс модели. Большая часть задач делегирована процессом индексной модели.
Mage_Index_Model_Event
хранит информацию о произошедшем событии Например, мы храним продукт и после сохранения создаем новое событие и храним информацию о том, какой тип сущности мы только что сохранили, какой идентификатор имеет дух и какое действие мы выполнили для этого вещества.
Общий список, когда происходит недействительность:
- каталог / продукт (SAVE, DELETE, MASS_ACTION)
- каталог / категория (СОХРАНИТЬ, УДАЛИТЬ)
- catalog / resource_eav_attribute (СОХРАНИТЬ, УДАЛИТЬ)
- клиент / группа (СОХРАНИТЬ)
- каталог инвентарь / stock_item (СОХРАНИТЬ)
- тег / тег (СОХРАНИТЬ)
- ядро / магазин (СОХРАНИТЬ, УДАЛИТЬ)
- core / store_group (СОХРАНИТЬ, УДАЛИТЬ)
- основной / веб-сайт (СОХРАНИТЬ, УДАЛИТЬ)
Любая модель ресурсов с зарегистрированным индексом в модуле config.xml
после сохранения транзакции. afterCommitCallback()
вызывается с префиксом. Здесь регистрируются события индекса, так как это происходит в конце успешной транзакции.
... и мне грустно, что EAV все еще есть в Magento 2. :(
Ссылки: