Ответ 1
Индексирование Magento аналогично индексированию на уровне базы данных по духу. Как утверждает Антон, это процесс денормализации, позволяющий ускорить работу сайта. Позвольте мне попытаться объяснить некоторые мысли, лежащие в основе структуры базы данных Magento, и почему она делает индексацию необходимой для работы на скорости.
В более "типичной" базе данных MySQL таблица для хранения продуктов каталога будет структурирована примерно так:
PRODUCT:
product_id INT
sku VARCHAR
name VARCHAR
size VARCHAR
longdesc VARCHAR
shortdesc VARCHAR
... etc ...
Это быстро для поиска, но это оставляет фундаментальную проблему для части программного обеспечения для электронной коммерции: что вы делаете, когда хотите добавить дополнительные атрибуты? Что делать, если вы продаете игрушки, а не колонку размера, вам нужно age_range
? Ну, вы можете добавить еще один столбец, но должно быть ясно, что в большом магазине (например, Walmart) это приведет к тому, что строки, которые на 90% пусты, и попытки обслуживания новых атрибутов почти невозможны.
Чтобы справиться с этой проблемой, Magento разбивает таблицы на меньшие единицы. Я не хочу воссоздавать всю систему EAV в этом ответе, поэтому, пожалуйста, примите эту упрощенную модель:
PRODUCT:
product_id INT
sku VARCHAR
PRODUCT_ATTRIBUTE_VALUES
product_id INT
attribute_id INT
value MISC
PRODUCT_ATTRIBUTES
attribute_id
name
Теперь можно добавлять атрибуты по желанию, введя новые значения в product_attributes
и затем помещая смежные записи в product_attribute_values
. Это в основном то, что делает Magento (с меньшим уважением к типам данных, чем я показал здесь). На самом деле, теперь нет причин для того, чтобы два продукта имели одинаковые поля вообще, поэтому мы можем создавать целые типы продуктов с разными наборами атрибутов!
Однако эта гибкость сопряжена с большими затратами. Если я хочу найти color
рубашки в моей системе (тривиальный пример), мне нужно найти:
-
product_id
элемента (в таблице продуктов) -
attribute_id
дляcolor
(в таблице атрибутов) - Наконец, фактический
value
(в таблице attribute_values)
Мадженто работал таким образом, но он был мертв медленно. Таким образом, чтобы обеспечить лучшую производительность, они сделали компромисс: после того, как владелец магазина определил нужные им атрибуты, вперед и создайте большую таблицу с самого начала. Когда что-то меняется, удалите его из космоса и сгенерируйте его снова. Таким образом, данные хранятся в основном в нашем удобном гибком формате, но запрашиваются из одной таблицы.
Эти результирующие таблицы поиска представляют собой "индексы" Magento. Когда вы повторно индексируете, вы взрываете старый стол и генерируете его снова.
Надеюсь, что это немного прояснит!
Спасибо, Джо