10

我在保存类别期间尝试提高性能,我发现一旦通过 Magenti API 或后端更新类别,就会调用以下更新查询

SQL: UPDATE `index_event` SET `event_id` = ?, `type` = ?, `entity` = ?, `entity_pk` = ?, `created_at` = ?, `old_data` = ?, `new_data` = ? WHERE (event_id='13066')
BIND: Array
(
    [0] => 13066
    [1] => save
    [2] => catalog_category
    [3] => 2867
    [4] => 2011-09-22 13:50:54
    [5] => a:4:{s:30:"Mage_Catalog_Model_Indexer_Url";N;s:40:"Mage_Catalog_Model_Category_Indexer_Flat";N;s:43:"Mage_Catalog_Model_Category_Indexer_Product";N;s:41:"Mage_CatalogSearch_Model_Indexer_Fulltext";N;}
    [6] => a:11:{s:35:"cataloginventory_stock_match_result";b:0;s:34:"catalog_product_price_match_result";b:0;s:24:"catalog_url_match_result";b:1;s:30:"Mage_Catalog_Model_Indexer_Url";N;s:33:"catalog_product_flat_match_result";b:0;s:34:"catalog_category_flat_match_result";b:1;s:40:"Mage_Catalog_Model_Category_Indexer_Flat";N;s:37:"catalog_category_product_match_result";b:1;s:43:"Mage_Catalog_Model_Category_Indexer_Product";N;s:35:"catalogsearch_fulltext_match_result";b:1;s:41:"Mage_CatalogSearch_Model_Indexer_Fulltext";N;}

谁能告诉我这是什么意思以及会发生什么?看起来一些索引操作被推送到队列,但它什么时候执行?

4

1 回答 1

21

您的假设“看起来某些索引操作被推送到队列”是正确的。

回答你的问题“但它什么时候执行?”

一些 Magento 模型,例如

Mage_Core_Model_Store
Mage_Catalog_Model_Product
Mage_Catalog_Model_Category
Mage_CatalogInventory_Model_Stock_Item
Mage_Tag_Model_Tag
Mage_Tag_Model_Tag_Relation

例如,队列索引事件。主要是在删除之前和/或提交之后。

他们通过调用类的logEvent()processEntityAction()方法来做到这一点Mage_Index_Model_Indexer

  • 如果他们logEvent()直接调用,索引事件将仅排队。甚至不会尝试重新索引。

  • 如果他们调用processEntityAction(),也会有一个索引事件排队,但 Magento 会在排队后立即尝试处理这个索引事件。

Mage_Index_Model_Indexer::indexEvents()某些模块还调用了第三种方法。与前两者的不同之处在于,它indexEvents()不会任何索引事件进行排队,而只会尝试立即重新索引。

请注意,processEntityAction()只有indexEvents()在相应索引类型的进程模式为Mage_Index_Model_Process::MODE_REAL_TIME.

您可以通过System -> Index Management. 如果该Mode列显示Update on save,则该索引设置为MODE_REAL_TIME

如果它改为手动更新,则设置为Mage_Index_Model_Process::MODE_MANUAL,这意味着永远不会发生自动重新索引。

在后一种情况下,您需要手动触发重新索引过程以重新索引数据。这可以使用多种方法来实现,例如通过在命令行上使用System -> Index Management -> Index -> Reindex data -> Submit或使用 Magento shell/indexer.php,或者通过编写由 cron 作业启动的自己的索引器进程集合处理脚本。

于 2012-06-20T16:16:15.597 回答