magento2在没有sql触发器的情况下工作吗?

ep6jt1vc  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(429)

情况是这样的。
我使用的是magento 2.1.6企业版。在magento文档中,有人说“magento使用mysql数据库触发器在重新索引期间改进数据库访问”。
但我的问题是如果我使用没有触发器的数据库会发生什么。因为我计划把数据库移到googlecloudsql上。在googlecloud文档中,他们说如果要使用复制,就要避免触发器,因为它可能会导致复制中的不一致性。
什么是最好的才是最好的?

yvt65v4c

yvt65v4c1#

magento使用mysql数据库触发器来改进重新索引期间的数据库访问。
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 在实体的任何表上。
在触发时,它们在特定的changelog表中创建一个具有实体id的新条目。
当cron作业运行时,它会将其mview\u state表的version\u id与change log表的version\u id进行比较。
将更新标记为已更改的所有实体的索引。特定实体的缓存也会失效(清除)。
触发器
当索引设置为“按计划更新”时,magento 2会为其创建一系列触发器。仅对于目录\产品\平面,就创建了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\u product\u entity”(请参阅表)中的更改。事件包括insert、update和delete。由于有10个表影响物化视图目录产品平面的内容,因此需要3 x 10=30个触发器来覆盖所有情况。
结论
如果您想以一种通过magento的管理面板无法实现的方式修改目录产品,或者通过phpmyadmin或脚本的直接sql查询可以更快地完成,这仍然是可能的,即使在生产webshop上也是如此。当然,您需要对magento的mysql表有很好的了解。但是,updatebyschedule中的部分重新索引技术确保了所有必要的索引和平面表都被更新,甚至特定的缓存也会失效。
参考文献:
https://magento.stackexchange.com/questions/117030/what-is-mview-in-magento2
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/indexing.html
https://www.bigbridge.nl/blog/essential-magento-2-partial-reindexing/
https://en.wikipedia.org/wiki/materialized_view

相关问题