Magento 2 结账变慢:quote 表的“杀手”

你的 Magento 2 店铺中潜伏着一个无声的性能杀手。它就存在于你的数据库中。

每当客户将商品添加到购物车时,quotequote_item 表就会增长。如果他们没有购买,记录仍会保留。经过几个月的时间,这些表会达到数百万行。

我曾见过一个 quote 表中有 1500 万行数据的店铺。结账速度从 1.2 秒降到了 8 秒。商家完全不知道原因。由于前端有缓存,在结账失败之前,一切看起来都很正常。

大型 quote 表会导致以下问题:

  • 由于沉重的数据库连接(joins),导致购物车页面加载缓慢。
  • 用于运费和总额计算的结账 AJAX 调用变慢。
  • 后台订单创建速度变慢。
  • 数据库备份和恢复时间变长。
  • PHP-FPM 内存压力增大。

如何修复:

  1. 评估损害 检查你的行数和表大小。查看 stale_inactive 的计数。这些是超过 30 天的弃置购物车。它们没有任何作用,只会减慢你的查询速度。

  2. 先归档,再删除 不要一次性删除数百万行数据。这会锁定你的表并导致数据库崩溃。首先,创建归档表,并将超过 90 天的非活跃 quote 移入其中。

  3. 使用分批删除 以 10,000 行一小块的方式进行删除。这可以防止长时间的表锁定。务必先删除子表,以遵循外键关系。顺序应为:

  • quote_item_option
  • quote_address_item
  • quote_shipping_rate
  • quote_payment
  • quote_address
  • quote_item
  • quote
  1. 优化与索引 运行 OPTIMIZE TABLE 以回收磁盘空间。添加复合索引以帮助数据库更快地找到活跃的 quote。例如,在 (is_active, updated_at) 上添加索引。

  2. 自动化清理 使用 Magento CLI 命令:bin/magento sales:cleanQuotes。 设置一个 cron 作业,在流量较低的时段每周运行一次。

专业提示:游客购物车(Guest carts)是导致数据膨胀的主要原因。在配置中将游客 quote 的有效期缩短至 7 天。这可以在不影响真实客户的情况下保持数据库的精简。

一位客户通过这些步骤将其结账加载时间从 6.5s 降低到了 1.4s。他们还回收了 9GB 的数据库空间。

保持 quote 表的精简,以维持高转化率。

Source: https://dev.to/magevanta/magento-2-quote-table-optimization-scaling-checkout-with-millions-of-abandoned-carts-4pmp