Jak radzić sobie z ogromnymi tabelami sales_flat_quote - usuń porzucone śmieci z koszyka


13

Sytuacja

W naszej bazie danych Magento mamy trzy tabele, które stają się zbyt duże.

  1. Sales_flat_quote_shipping_rate: 3045 MB
  2. sales_flat_quote_address: 1688 MB
  3. oferta sprzedaży: 1897 MB

To ponad 6 GB danych.

Znalazłem ten artykuł na temat obcinania tych tabel . Ten artykuł mówi tylko o trzeciej tabeli.

Nie jestem pewien co do obcięcia i wolę usunąć wszystkie dane starsze niż 60 dni. Artykuł mówi o 17 milionach płyt - mamy 20! Jeśli mam rację, usunięcie tych rekordów nie zablokuje tabeli, a obecnie testuję to podczas instalacji testowej. To wydaje się działać i nie powoduje zbytniego konfliktu z witryną.

pytania

  • Chciałbym wiedzieć, czy mogę użyć tego samego zapytania również dla pozostałych dwóch tabel?
  • Zastanawiam się, do czego służą te tabele.

Odpowiedzi:


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

sales_flat_quote i powiązane tabele używają relacji klucza obcego do kasowania kaskadowego, więc usuwanie w tabeli podstawowej automatycznie usuwa wszystkie powiązane wpisy w pozostałych tabelach.

Po zmniejszeniu rozmiaru możesz łatwo zmodyfikować obserwatora (tutaj obowiązkowo należy utworzyć moduł), który ma wyczyścić wygasłe cytaty, aby uwzględnić wszystkie cytaty, jak to ma miejsce w pierwszym łączu z dostosowanym przechowywaniem dla odzyskiwania porzuconego koszyka i przechowywania zalogowanych w wycenach klientów przez rozsądny okres, aby Twoi klienci nie wściekali się, gdy ich koszyk został nieoczekiwanie opróżniony: Czy w Magento kiedykolwiek usuwane są nieodwracalne zapisy wycen?

lub skorzystaj z AOE Quote Cleaner firmy Fabrizio Branca

sale_flat_quote * tabele zawierają zawartość koszyka. Jest to znane jako oferta i trwa do momentu, aż klient nie zdecyduje się zakończyć składania zamówienia. W przypadku gotowych ofert, które zostały przekonwertowane na Zamówienie sprzedaży, Magento automatycznie usuwa je za pomocą zadania cron. Logika nigdy nie została poszerzona o otwarte cytaty.


Widzę, że rozmiar drugiej tabeli maleje, więc kaskadowanie działa. Zamierzam przetestować moduł AOE. To dobra wskazówka!
SPRBRN

1
Uruchomiłem ten skrypt wiele razy, limit 1000000dopóki nie zniknęły wszystkie rekordy starsze niż 60 dni. Następnie zainstalowałem moduł AOE Quote Cleaner. Nie użyłem modułu AOE do usuwania 20 m, ponieważ strona przestała działać - przynajmniej na maszynie testowej. Skrypt nie stwarzał żadnych problemów.
SPRBRN

1
Nie ma za co! Musiałem poradzić sobie z tym problemem, zanim moduł Fabrizio stał się dostępny, więc poszedłem drogą obserwatora po zrobieniu czegoś podobnego do czyszczenia. Oczyszczenie pojemnika zajęło około 20 przejść. Teraz, gdy planowane jest czyszczenie, nie martw się!
Fiasco Labs,

Chcę usunąć niektóre rekordy, których klient nie istnieje.
Urocza Setia,

1

W Magento2 „sales_flat_quote” zostało zastąpione przez „quote”, więc następujące polecenie SQL może rozwiązać ten problem w Magento2:

update quote set items_count = NULL

1
Niby mieszając z odpowiedzią @ fiasco:DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
nicolallias

0

Chociaż rozwiązanie Fiasco Labs działa, zacznę od rozszerzenia od samego początku i użyję go Mage_Sales_Model_Quote_Resource_Collectiondo filtrowania i usuwania starszych ofert wyboru. Korzystając z odpowiednich metod, możesz mieć pewność, że Twoja operacja będzie działać na każdej instalacji Magento, nie polegając na ograniczeniach bazy danych lub surowych zapytaniach.

Coś jak (niesprawdzone)…

$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
}

Możesz to rozszerzyć Mage_Loglub stworzyć własne samodzielne rozszerzenie. Dość proste.


Dlaczego miałbym chcieć stworzyć własny moduł, skoro AOE ma działający moduł gotowy do pobrania?
SPRBRN

1
Rozszerzenia AOE są świetne, więc wcale ich nie dyskredytuję. Ale podając powody. 1.Unikaj ręcznych zapytań w rozszerzeniach. 2.Jeśli to możliwe, postaraj się, aby rozszerzenia były niezależne. DELETEtakie zapytania zależą od ograniczenia bazy danych, które może ulec zmianie w przyszłości. 3.Stosuj odpowiednio metody fabryczne Magento.
musicliftsme

Wygląda na to, że ten powstał jakiś czas temu @musicliftsme .. zazwyczaj są całkiem niezłe
Erfan

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

To zapytanie spowoduje usunięcie wszystkich ofert, które nie zostały zamienione na zamówienia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.