Magento 2 체크아웃 속도 저하: Quote 테이블이 성능을 갉아먹는 주범

여러분의 Magento 2 스토어에는 조용한 성능 저하 요인이 숨어 있습니다. 바로 데이터베이스 안에 있습니다.

고객이 장바구니에 제품을 추가할 때마다 quotequote_item 테이블은 계속 커집니다. 구매를 하지 않더라도 해당 레코드는 그대로 남습니다. 몇 달이 지나면 이 테이블들은 수백만 개의 행(row)을 갖게 됩니다.

한 번은 quote 테이블에 1,500만 개의 행이 쌓인 스토어를 본 적이 있습니다. 체크아웃 속도가 1.2초에서 8초로 떨어졌지만, 상점 주인은 이유를 전혀 몰랐습니다. 프론트엔드는 캐싱되어 있어 체크아웃이 실패하기 전까지는 모든 것이 정상처럼 보였기 때문입니다.

거대한 quote 테이블은 다음과 같은 문제를 일으킵니다:

  • 무거운 데이터베이스 조인(join)으로 인한 장바구니 페이지 로딩 지연.
  • 배송 및 합계 계산을 위한 체크아웃 AJAX 호출 지연.
  • 관리자 페이지의 주문 생성 속도 저하.
  • 데이터베이스 백업 및 복구 시간 증가.
  • PHP-FPM의 높은 메모리 압박.

How to fix it:

  1. Measure the damage 행 개수와 테이블 크기를 확인하세요. stale_inactive 카운트를 확인하십시오. 이는 30일이 지난 방치된 장바구니입니다. 아무런 역할도 하지 않으면서 쿼리 속도만 늦출 뿐입니다.

  2. Archive before you delete 수백만 개의 행을 한꺼번에 삭제하지 마세요. 테이블이 잠기거나(lock) 데이터베이스가 다운될 수 있습니다. 먼저 아카이브 테이블을 생성한 다음, 90일이 지난 비활성 quote를 그곳으로 이동시키세요.

  3. Use batched deletes 10,000개씩 작은 단위로 나누어 삭제하세요. 이렇게 하면 긴 테이블 잠금을 방지할 수 있습니다. 외래 키(foreign key) 관계를 준수하기 위해 항상 자식 테이블을 먼저 삭제해야 합니다. 삭제 순서는 다음과 같아야 합니다:

  • quote_item_option
  • quote_address_item
  • quote_shipping_rate
  • quote_payment
  • quote_address
  • quote_item
  • quote
  1. Optimize and Index OPTIMIZE TABLE을 실행하여 디스크 공간을 확보하세요. 데이터베이스가 활성 quote를 더 빠르게 찾을 수 있도록 복합 인덱스(composite index)를 추가하세요. 예를 들어, (is_active, updated_at)에 인덱스를 추가할 수 있습니다.

  2. Automate the cleanup Magento CLI 명령어를 사용하세요: bin/magento sales:cleanQuotes. 트래픽이 적은 시간대에 매주 실행되도록 크론 잡(cron job)을 설정하세요.

Pro Tip: 비회원(Guest) 장바구니가 가장 큰 비대화의 원인입니다. 설정에서 비회원 quote의 유효 기간을 7일로 줄이세요. 이렇게 하면 실제 고객에게 영향을 주지 않으면서 데이터베이스를 가볍게 유지할 수 있습니다.

한 고객은 이 단계를 적용하여 체크아웃 로딩 시간을 6.5초에서 1.4초로 단축했습니다. 또한 9GB의 데이터베이스 공간을 확보했습니다.

전환율을 높게 유지하려면 quote 테이블을 작게 유지하십시오.

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