【问题标题】:Does magento 2 works without SQL triggers?magento 2 是否可以在没有 SQL 触发器的情况下工作?
【发布时间】:2018-11-15 07:05:59
【问题描述】:

情况是这样的。

我使用的是 magento 2.1.6 企业版。在 magento 文档中,有人说“Magento 使用 MySQL 数据库触发器来改善重新索引期间的数据库访问”。

但我的问题是,如果我使用没有触发器的数据库会发生什么。因为我打算将数据库移动到谷歌云 SQL。在谷歌云文档中,他们说如果您要使用复制,请避免触发,因为它可能会导致副本不一致。

什么是最好的最好的呢?

【问题讨论】:

    标签: mysql magento2 google-cloud-sql


    【解决方案1】:

    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 表有很好的了解。但是按计划更新的部分重新索引技术确保更新所有必要的索引和平面表,甚至使特定的缓存失效。

    参考文献:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 2010-09-18
      • 2013-03-10
      • 1970-01-01
      相关资源
      最近更新 更多