Magento 2のチェックアウト遅延:quoteテーブルというキラー

あなたのMagento 2ストアには、静かにパフォーマンスを低下させる「キラー」が潜んでいます。それはデータベースの中にあります。

顧客が商品をカートに追加するたびに、quoteテーブルとquote_itemテーブルは肥大化します。購入に至らなかった場合でも、そのレコードは残り続けます。数ヶ月経つと、これらのテーブルは数百万行に達します。

かつて、quoteテーブルに1,500万行ものデータがあるストアを見たことがあります。その際、チェックアウトの速度は1.2秒から8秒へと低下していました。ショップオーナーは原因が分からず困惑していました。フロントエンドはキャッシュされていたため、チェックアウトが失敗するまで、すべてが正常に動作しているように見えていたのです。

肥大化したquoteテーブルは、以下のような問題を引き起こします:

  • 重いデータベース結合による、カートページの読み込み遅延。
  • 送料や合計金額の計算における、チェックアウト時の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ジョブを設定してください。

プロのヒント:最も肥大化の原因となるのはゲストカートです。設定でゲストquoteの有効期限を7日間に短縮しましょう。これにより、実際の顧客に影響を与えることなく、データベースを軽量に保つことができます。

あるクライアントは、これらの手順を踏むことで、チェックアウトの読み込み時間を6.5秒から1.4秒に短縮しました。また、9GBのデータベース容量を回収することにも成功しました。

コンバージョン率を高く維持するために、quoteテーブルは常に小さく保ちましょう。

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