Magento 2 체크아웃 속도 저하: Quote 테이블이 성능을 갉아먹는 주범
여러분의 Magento 2 스토어에는 조용한 성능 저하 요인이 숨어 있습니다. 바로 데이터베이스 안에 있습니다.
고객이 장바구니에 제품을 추가할 때마다 quote와 quote_item 테이블은 계속 커집니다. 구매를 하지 않더라도 해당 레코드는 그대로 남습니다. 몇 달이 지나면 이 테이블들은 수백만 개의 행(row)을 갖게 됩니다.
한 번은 quote 테이블에 1,500만 개의 행이 쌓인 스토어를 본 적이 있습니다. 체크아웃 속도가 1.2초에서 8초로 떨어졌지만, 상점 주인은 이유를 전혀 몰랐습니다. 프론트엔드는 캐싱되어 있어 체크아웃이 실패하기 전까지는 모든 것이 정상처럼 보였기 때문입니다.
거대한 quote 테이블은 다음과 같은 문제를 일으킵니다:
- 무거운 데이터베이스 조인(join)으로 인한 장바구니 페이지 로딩 지연.
- 배송 및 합계 계산을 위한 체크아웃 AJAX 호출 지연.
- 관리자 페이지의 주문 생성 속도 저하.
- 데이터베이스 백업 및 복구 시간 증가.
- PHP-FPM의 높은 메모리 압박.
How to fix it:
Measure the damage 행 개수와 테이블 크기를 확인하세요.
stale_inactive카운트를 확인하십시오. 이는 30일이 지난 방치된 장바구니입니다. 아무런 역할도 하지 않으면서 쿼리 속도만 늦출 뿐입니다.Archive before you delete 수백만 개의 행을 한꺼번에 삭제하지 마세요. 테이블이 잠기거나(lock) 데이터베이스가 다운될 수 있습니다. 먼저 아카이브 테이블을 생성한 다음, 90일이 지난 비활성 quote를 그곳으로 이동시키세요.
Use batched deletes 10,000개씩 작은 단위로 나누어 삭제하세요. 이렇게 하면 긴 테이블 잠금을 방지할 수 있습니다. 외래 키(foreign key) 관계를 준수하기 위해 항상 자식 테이블을 먼저 삭제해야 합니다. 삭제 순서는 다음과 같아야 합니다:
- quote_item_option
- quote_address_item
- quote_shipping_rate
- quote_payment
- quote_address
- quote_item
- quote
Optimize and Index
OPTIMIZE TABLE을 실행하여 디스크 공간을 확보하세요. 데이터베이스가 활성 quote를 더 빠르게 찾을 수 있도록 복합 인덱스(composite index)를 추가하세요. 예를 들어,(is_active, updated_at)에 인덱스를 추가할 수 있습니다.Automate the cleanup Magento CLI 명령어를 사용하세요:
bin/magento sales:cleanQuotes. 트래픽이 적은 시간대에 매주 실행되도록 크론 잡(cron job)을 설정하세요.
Pro Tip: 비회원(Guest) 장바구니가 가장 큰 비대화의 원인입니다. 설정에서 비회원 quote의 유효 기간을 7일로 줄이세요. 이렇게 하면 실제 고객에게 영향을 주지 않으면서 데이터베이스를 가볍게 유지할 수 있습니다.
한 고객은 이 단계를 적용하여 체크아웃 로딩 시간을 6.5초에서 1.4초로 단축했습니다. 또한 9GB의 데이터베이스 공간을 확보했습니다.
전환율을 높게 유지하려면 quote 테이블을 작게 유지하십시오.
