Magento 2订单与客户网格加载缓慢,寻求禁用计数优化方案
针对你的店铺(80万客户、160万订单)因第三方扩展添加多余JOIN导致订单/客户网格计数查询过慢的问题,以下是几种有效禁用网格计数的方案:
方案一:通过插件拦截计数查询
Magento的网格计数由DataProvider类的getTotalCount方法触发,我们可以通过插件直接跳过耗时的计数查询,返回固定值或估算值。
订单网格插件示例
创建app/code/YourVendor/YourModule/Plugin/Sales/Ui/DataProvider/OrderDataProviderPlugin.php:
<?php namespace YourVendor\YourModule\Plugin\Sales\Ui\DataProvider; use Magento\Sales\Ui\Component\DataProvider\OrderDataProvider; class OrderDataProviderPlugin { public function aroundGetTotalCount(OrderDataProvider $subject, \Closure $proceed) { // 返回订单总数估算值,或返回0隐藏总数 return 1600000; // return 0; } }
客户网格插件示例
创建app/code/YourVendor/YourModule/Plugin/Customer/Ui/DataProvider/CustomerDataProviderPlugin.php:
<?php namespace YourVendor\YourModule\Plugin\Customer\Ui\DataProvider; use Magento\Customer\Ui\Component\DataProvider\CustomerDataProvider; class CustomerDataProviderPlugin { public function aroundGetTotalCount(CustomerDataProvider $subject, \Closure $proceed) { // 返回客户总数估算值 return 800000; // return 0; } }
注册插件
在app/code/YourVendor/YourModule/etc/di.xml中添加:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Sales\Ui\Component\DataProvider\OrderDataProvider"> <plugin name="disable_order_grid_count" type="YourVendor\YourModule\Plugin\Sales\Ui\DataProvider\OrderDataProviderPlugin" sortOrder="10"/> </type> <type name="Magento\Customer\Ui\Component\DataProvider\CustomerDataProvider"> <plugin name="disable_customer_grid_count" type="YourVendor\YourModule\Plugin\Customer\Ui\DataProvider\CustomerDataProviderPlugin" sortOrder="10"/> </type> </config>
执行bin/magento setup:di:compile和bin/magento cache:flush使插件生效。
方案二:修改UI组件配置隐藏总数显示
如果不需要彻底禁用计数查询,只是想隐藏前端的总数展示,可以修改网格的UI配置文件:
订单网格配置
编辑app/code/Magento/Sales/view/adminhtml/ui_component/sales_order_grid.xml(或在主题/自定义模块中重写),找到paging组件添加showTotal="false":
<listingToolbar name="listing_top"> <paging name="listing_paging" showTotal="false"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">sales_order_grid.sales_order_grid.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.paging</item> </item> </item> </argument> </paging> </listingToolbar>
客户网格配置
编辑app/code/Magento/Customer/view/adminhtml/ui_component/customer_listing.xml,同样修改paging组件:
<listingToolbar name="listing_top"> <paging name="listing_paging" showTotal="false"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">customer_listing.customer_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.paging</item> </item> </item> </argument> </paging> </listingToolbar>
执行bin/magento cache:flush后,前端网格将不再显示总数,部分版本会直接跳过计数查询。
方案三:禁用不必要的第三方扩展
从慢查询可以看到,订单网格的ae_ec、amasty_mostviewed_pack_sales_history,客户网格的amasty_rewards_rewards是多余JOIN的来源。如果这些扩展功能非必需,直接禁用即可从根源解决问题:
# 根据实际扩展名调整 bin/magento module:disable Ae_Ec Amasty_MostviewedPack Amasty_Rewards bin/magento setup:upgrade bin/magento cache:flush
内容的提问来源于stack exchange,提问作者Anton-GrNL

