Magento 2のチェックアウト遅延:quoteテーブルというキラー
あなたのMagento 2ストアには、静かにパフォーマンスを低下させる「キラー」が潜んでいます。それはデータベースの中にあります。
顧客が商品をカートに追加するたびに、quoteテーブルとquote_itemテーブルは肥大化します。購入に至らなかった場合でも、そのレコードは残り続けます。数ヶ月経つと、これらのテーブルは数百万行に達します。
かつて、quoteテーブルに1,500万行ものデータがあるストアを見たことがあります。その際、チェックアウトの速度は1.2秒から8秒へと低下していました。ショップオーナーは原因が分からず困惑していました。フロントエンドはキャッシュされていたため、チェックアウトが失敗するまで、すべてが正常に動作しているように見えていたのです。
肥大化したquoteテーブルは、以下のような問題を引き起こします:
- 重いデータベース結合による、カートページの読み込み遅延。
- 送料や合計金額の計算における、チェックアウト時のAJAX呼び出しの遅延。
- 管理画面での注文作成の遅延。
- データベースのバックアップおよびリカバリ時間の増大。
- PHP-FPMへの高いメモリ負荷。
解決策:
被害状況を把握する 行数とテーブルサイズを確認してください。
stale_inactiveの件数に注目しましょう。これらは30日以上経過した放棄されたカートです。クエリを遅くするだけで、何の役にも立ちません。削除する前にアーカイブする 数百万行のデータを一度に削除してはいけません。テーブルがロックされ、データベースがクラッシュする恐れがあります。まずアーカイブ用のテーブルを作成し、90日以上経過した非アクティブなquoteをそこに移動させてください。
バッチ削除を利用する 10,000行ずつの小さなチャンクに分けて削除してください。これにより、長いテーブルロックを防ぐことができます。外部キー制約を尊重するため、必ず子テーブルから先に削除してください。削除の順序は以下の通りです:
quote_item_optionquote_address_itemquote_shipping_ratequote_paymentquote_addressquote_itemquote
最適化とインデックスの追加
OPTIMIZE TABLEを実行してディスク領域を解放してください。データベースがアクティブなquoteをより速く見つけられるよう、複合インデックスを追加します。例えば、(is_active, updated_at)にインデックスを追加します。クリーンアップを自動化する MagentoのCLIコマンド
bin/magento sales:cleanQuotesを使用します。トラフィックの少ない時間帯に、毎週実行されるようcronジョブを設定してください。
プロのヒント:最も肥大化の原因となるのはゲストカートです。設定でゲストquoteの有効期限を7日間に短縮しましょう。これにより、実際の顧客に影響を与えることなく、データベースを軽量に保つことができます。
あるクライアントは、これらの手順を踏むことで、チェックアウトの読み込み時間を6.5秒から1.4秒に短縮しました。また、9GBのデータベース容量を回収することにも成功しました。
コンバージョン率を高く維持するために、quoteテーブルは常に小さく保ちましょう。
