Индексация 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 используется для работыкак это, но это было очень медленно.Таким образом, чтобы обеспечить лучшую производительность, они пошли на компромисс: как только владелец магазина определил нужные атрибуты, продолжайте и создавайте большую таблицу с самого начала.Когда что-то меняется, уберите его из космоса и сгенерируйте заново.Таким образом, данные хранятся в основном в нашем удобном гибком формате, но запрашиваются из одной таблицы.
Эти результирующие таблицы поиска являются "индексами" Magento.Когда вы переиндексируете, вы взрываете старую таблицу и генерируете ее снова.
Надеюсь, это немного прояснит ситуацию!
Спасибо, Джо