Magento 使用MySQL database triggers 在重新索引期间改进数据库访问。
Magento 不支持 Magento 数据库中的任何 custom triggers,因为自定义触发器可能会导致与未来 Magento 版本不兼容。
Magento 索引机制在重新索引触发过程中使用状态值。
您可以在管理面板中查看索引器的状态
系统>新索引管理
或手动使用命令行。
查看索引器列表
查看所有索引器的列表:
bin/magento indexer:info
列表显示如下:
catalog_category_product Category Products
catalog_product_category Product Categories
catalog_product_price Product Price
catalog_product_attribute Product EAV
cataloginventory_stock Stock
catalogrule_rule Catalog Rule Product
catalogrule_product Catalog Product Rule
catalogsearch_fulltext Catalog Search
它是如何工作的?
简而言之,Magento 2 为每个“Update by Schedule” 索引创建触发器。
这些触发器在任何实体表上的任何INSERT, UPDATE and DELETE 上触发。
在触发时,它们会创建一个新条目,其实体 ID 位于特定的
更改日志表。
当 cron 作业运行时,它会比较其 mview_state 的 version_id
带有更改日志表的 version_ids 的表。
为所有标记为已更改的实体更新索引。
特定实体的缓存也会失效(清除)。
触发器
当索引设置为“按计划更新”时,Magento 2 会为其创建一系列触发器。仅对于 catalog_product_flat,就创建了 30 个触发器。
mysql> show triggers \G
*************************** 1. row ***************************
Trigger: trg_catalog_product_entity_after_insert
Event: INSERT
Table: catalog_product_entity
Statement: BEGIN
INSERT IGNORE INTO `catalog_product_flat_cl` (`entity_id`) VALUES (NEW.`entity_id`);
END
Timing: AFTER
Created: 2018-01-10 16:04:59.54
sql_mode:
Definer: some-magento-user@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
Trigger: trg_catalog_product_entity_after_update
Event: UPDATE
Table: catalog_product_entity
Statement: BEGIN
INSERT IGNORE INTO `catalog_product_flat_cl` (`entity_id`) VALUES (NEW.`entity_id`);
END
Timing: AFTER
Created: 2018-01-10 16:04:59.56
sql_mode:
Definer: some-magento-user@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
*************************** 3. row ***************************
Trigger: trg_catalog_product_entity_after_delete
Event: DELETE
Table: catalog_product_entity
Statement: BEGIN
INSERT IGNORE INTO `catalog_product_flat_cl` (`entity_id`) VALUES (OLD.`entity_id`);
END
Timing: AFTER
Created: 2018-01-10 16:04:59.57
sql_mode:
Definer: some-magento-user@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
您在此处看到的 3 个触发器都响应表“catalog_product_entity”中的更改(参见表)。事件是 INSERT、UPDATE 和 DELETE。由于有 10 个表会影响物化视图 catalog_product_flat 的内容,因此需要 3 x 10 = 30 个触发器才能覆盖所有情况。
结论
如果您想通过 Magento 的管理面板无法实现的方式修改目录产品,或者可以通过使用 phpMyAdmin 或脚本的直接 SQL 查询更快地完成,即使在生产网店中,这仍然是可能的.当然,你需要对 Magento 的 MySQL 表有很好的了解。但是按计划更新的部分重新索引技术确保更新所有必要的索引和平面表,甚至使特定的缓存失效。
参考文献: