Cách xử lý các bảng sales_flat_quote khổng lồ - loại bỏ giỏ hàng bị bỏ rơi


13

Tình hình

Trong cơ sở dữ liệu magento của chúng tôi, chúng tôi có ba bảng đang phát triển quá lớn.

  1. sales_flat_quote_shipping_rate: 3045MB
  2. sales_flat_quote_address: 1688MB
  3. sales_flat_quote: 1897MB

Đó là hơn 6GB dữ liệu.

Tôi đã tìm thấy bài viết này về cách cắt bớt các bảng này . Bài viết này chỉ nói về bảng thứ ba.

Tôi không chắc chắn về việc cắt ngắn và tôi muốn xóa tất cả dữ liệu cũ hơn 60 ngày. Bài báo nói về 17 triệu hồ sơ - chúng tôi có 20! Nếu tôi đúng, xóa các bản ghi này sẽ không khóa bảng và tôi hiện đang thử nghiệm bản này khi cài đặt thử nghiệm. Điều đó dường như hoạt động và nó không xung đột quá nhiều với trang web.

Câu hỏi

  • Tôi muốn biết nếu tôi có thể sử dụng cùng một truy vấn cho hai bảng khác không?
  • Tôi đang tự hỏi những cái bàn này dùng để làm gì.

Câu trả lời:


22
DELETE FROM sales_flat_quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)

sales_flat_quote và các bảng có liên quan sử dụng các quan hệ khóa ngoài để xóa trên tầng để việc xóa trong bảng chính sẽ tự động xóa tất cả các mục liên quan trong các bảng khác.

Khi bạn giảm kích thước, bạn có thể dễ dàng sửa đổi người quan sát (bắt buộc phải tạo mô-đun ở đây) có nghĩa vụ xóa sạch các trích dẫn đã hết hạn để bao gồm tất cả các trích dẫn như được thực hiện trong liên kết đầu tiên với lưu giữ tùy chỉnh để phục hồi giỏ hàng bị bỏ rơi và lưu giữ nhật ký trong báo giá của khách hàng trong một khoảng thời gian hợp lý để khách hàng của bạn không phát điên khi giỏ hàng của họ bất ngờ xuất hiện: Các bản ghi trích dẫn chưa được chuyển đổi có bị xóa trong Magento không?

hoặc sử dụng AOE Trích dẫn của Fabrizio Branca

bảng sales_flat_quote * chứa nội dung giỏ hàng. Điều này được gọi là một báo giá và được tổ chức cho đến khi khách hàng quyết định hoàn thành việc đặt hàng. Đối với các trích dẫn đã hoàn thành đã được chuyển đổi thành Đơn đặt hàng, Magento sẽ tự động xóa chúng bằng một công việc định kỳ. Logic không bao giờ được mở rộng để bao gồm các trích dẫn mở.


Tôi thấy rằng kích thước của bảng khác giảm, do đó, tầng hoạt động. Tôi sẽ thử nghiệm mô-đun AOE. Đó là một mẹo hay!
XUÂN

1
Tôi đã chạy kịch bản đó nhiều lần, với limit 1000000, cho đến khi tất cả các hồ sơ cũ hơn 60 ngày đã biến mất. Sau đó, tôi đã cài đặt mô-đun AOE quote Cleaner. Tôi đã không sử dụng mô-đun AOE cho các lần xóa 20m, vì trang web đã ngừng hoạt động - ít nhất là trên máy thử nghiệm. Kịch bản không đặt ra bất kỳ vấn đề.
XUÂN

1
Không có gì! Tôi đã phải giải quyết vấn đề trở lại trước khi mô-đun của Fabrizio có sẵn và vì vậy đã đi theo con đường quan sát sau khi làm điều gì đó tương tự như việc dọn dẹp của bạn. Phải mất khoảng 20 lượt để xóa gunk. Bây giờ nó đã được dọn dẹp theo lịch trình, không phải lo lắng!
Phòng thí nghiệm Fiasco

Tôi muốn xóa một số hồ sơ mà khách hàng không tồn tại.
Setia đáng yêu

1

Trong Magento2, 'sales_flat_quote' đã được thay thế bằng 'quote', do đó, lệnh SQL có thể khắc phục sự cố này cho Magento2:

update quote set items_count = NULL

1
Kiểu, trộn với câu trả lời của @ fiasco:DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
nicolallias

0

Mặc dù giải pháp của Fiasco Labs hoạt động, tôi sẽ chỉ bắt đầu với một tiện ích mở rộng ngay từ khi đi và sử dụng Mage_Sales_Model_Quote_Resource_Collectionđể lọc và xóa các trích dẫn cũ hơn về lựa chọn. Sử dụng các phương pháp thích hợp, bạn có thể đảm bảo hoạt động của mình sẽ hoạt động trên mọi cài đặt Magento bằng cách không dựa vào các ràng buộc cơ sở dữ liệu hoặc truy vấn thô.

Một cái gì đó như (chưa được kiểm tra)

$collection = Mage::getModel('sales/quote')->getCollection() 
    -->addFieldToSelect('entity_id') // this is important
    -->addFieldToFilter('created_at', array('lt' => 'some_date'));

foreach ($collection as $quote) {
    $quote->delete(); // safely delete selected quote
}

Bạn có thể mở rộng điều này ra khỏi Mage_Log hoặc thực hiện phần mở rộng độc lập của riêng mình. Khá đơn giản.


Tại sao tôi muốn tạo mô-đun của riêng mình khi AOE có sẵn mô-đun làm việc để tải xuống?
XUÂN

1
Các tiện ích mở rộng AOE rất tuyệt, vì vậy tôi hoàn toàn không làm mất uy tín của chúng. Nhưng để cung cấp cho bạn lý do .. 1.Tránh sử dụng truy vấn thủ công trong tiện ích mở rộng. 2.Cố gắng làm cho bạn mở rộng độc lập, nếu có thể. DELETEcác truy vấn như thế này phụ thuộc vào ràng buộc cơ sở dữ liệu, có thể bị thay đổi trong tương lai. 3.Sử dụng phương pháp nhà máy Magento một cách thích hợp.
nhạcliftsme

Có vẻ như cái đó đã được tạo ra cách đây một thời gian @musicliftsme .. thường thì chúng khá tốt
Erfan

0
DELETE FROM sales_flat_quote WHERE entity_id NOT IN (SELECT quote_id FROM sales_flat_order);

Truy vấn này sẽ xóa tất cả các trích dẫn, nơi không được chuyển đổi trong đơn đặt hàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.