Magento 2 Checkout bị chậm: "Kẻ sát nhân" từ bảng Quote
Cửa hàng Magento 2 của bạn đang có một "kẻ sát nhân" hiệu năng thầm lặng. Nó nằm ngay trong cơ sở dữ liệu của bạn.
Các bảng quote và quote_item sẽ tăng lên mỗi khi khách hàng thêm sản phẩm vào giỏ hàng. Nếu họ không mua hàng, bản ghi đó vẫn tồn tại. Qua nhiều tháng, các bảng này có thể lên tới hàng triệu dòng.
Tôi từng thấy một cửa hàng có tới 15 triệu dòng trong bảng quote. Tốc độ thanh toán (checkout) đã giảm từ 1,2 giây xuống còn 8 giây. Chủ cửa hàng không hề biết lý do tại sao. Phần frontend đã được cache, nên mọi thứ trông vẫn ổn cho đến khi quá trình thanh toán bị lỗi.
Các bảng quote lớn gây ra những vấn đề sau:
- Tải trang giỏ hàng chậm do các phép join cơ sở dữ liệu nặng nề.
- Các lệnh gọi AJAX khi thanh toán (để tính phí vận chuyển và tổng tiền) bị chậm.
- Tạo đơn hàng trong trang quản trị (admin) chậm hơn.
- Thời gian sao lưu và khôi phục cơ sở dữ liệu lâu hơn.
- Áp lực bộ nhớ cao lên PHP-FPM.
Cách khắc phục:
Đo lường thiệt hại Kiểm tra số lượng dòng và kích thước bảng. Hãy tìm số lượng
stale_inactive. Đây là những giỏ hàng bị bỏ rơi đã hơn 30 ngày. Chúng không có tác dụng gì ngoài việc làm chậm các câu truy vấn của bạn.Lưu trữ trước khi xóa Đừng xóa hàng triệu dòng cùng một lúc. Việc này sẽ khóa các bảng và làm sập cơ sở dữ liệu của bạn. Trước tiên, hãy tạo các bảng lưu trữ (archive tables) và chuyển các quote không hoạt động (older than 90 days) vào đó.
Sử dụng xóa theo lô (batched deletes) Xóa các dòng theo từng đợt nhỏ khoảng 10.000 dòng. Điều này giúp ngăn chặn tình trạng khóa bảng kéo dài. Luôn xóa các bảng con trước để đảm bảo tính toàn vẹn của các mối quan hệ khóa ngoại (foreign key). Thứ tự nên là:
quote_item_optionquote_address_itemquote_shipping_ratequote_paymentquote_addressquote_itemquote
Tối ưu hóa và lập chỉ mục (Index) Chạy lệnh
OPTIMIZE TABLEđể thu hồi không gian đĩa. Thêm các chỉ mục hỗn hợp (composite indexes) để giúp cơ sở dữ liệu tìm các quote đang hoạt động nhanh hơn. Ví dụ: thêm một index vào(is_active, updated_at).Tự động hóa việc dọn dẹp Sử dụng lệnh Magento CLI:
bin/magento sales:cleanQuotes. Thiết lập một cron job để chạy lệnh này hàng tuần vào thời điểm ít truy cập.
Pro Tip: Giỏ hàng của khách vãng lai (guest carts) là nguyên nhân gây phình to dữ liệu nhiều nhất. Hãy giảm thời gian tồn tại của guest quote xuống còn 7 ngày trong phần cấu hình. Điều này giúp cơ sở dữ liệu của bạn gọn nhẹ mà không ảnh hưởng đến khách hàng thực sự.
Một khách hàng đã thấy thời gian tải trang thanh toán giảm từ 6,5 giây xuống còn 1,4 giây khi áp dụng các bước này. Họ cũng đã thu hồi được 9GB dung lượng cơ sở dữ liệu.
Hãy giữ cho các bảng quote luôn nhỏ gọn để duy trì tỷ lệ chuyển đổi cao.
