Büyük sales_flat_quote tabloları nasıl ele alınır - terk edilmiş sepet çöpü kaldır


13

Durum

Magento veritabanımızda çok büyük büyüyen üç tablo var.

  1. sales_flat_quote_shipping_rate: 3045MB
  2. sales_flat_quote_address: 1688MB
  3. satış_flat_quote: 1897MB

Bu 6GB'tan fazla veri.

Bu tabloları kısaltmak için bu makaleyi buldum . Bu makalede yalnızca üçüncü tablodan bahsedilmektedir.

Kesimden emin değilim ve 60 günden eski tüm verileri silmeyi tercih ediyorum. Makale 17 milyon kayıttan bahsediyor - 20 tane var! Doğruysam, bu kayıtları silmek tabloyu kilitlemez ve şu anda bunu bir test yüklemesinde test ediyorum. Bu işe yarıyor gibi görünüyor ve site ile çok fazla çatışmıyor.

Sorular

  • Ben de diğer iki tablo için aynı sorguyu kullanabilirsiniz bilmek istiyorum?
  • Bu tabloların ne için olduğunu merak ediyorum.

Yanıtlar:


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

sales_flat_quote ve ilişkili tablolar basamaklı olarak silmek için yabancı anahtar ilişkileri kullanır, böylece birincil tablodaki silme işlemleri diğer tablolardaki tüm ilgili girdileri otomatik olarak siler.

Bir kez boyutuna getirdiğinizde, terk edilmiş sepeti kurtarma ve günlüğe alıkoyma için özelleştirilmiş tutma ile ilk bağlantıda yapılan tüm tırnakları dahil etmek için süresi dolmuş tırnakları temizlemesi gereken gözlemciyi (burada zorunlu bir modül yapın) kolayca değiştirebilirsiniz. alışveriş sepetiniz beklenmedik bir şekilde boşaldığında müşterileriniz kızmaz, bu nedenle Magento'da dönüştürülmemiş teklif kayıtları kaldırılır mı?

Branca'nın AOE Alıntı Temizleyicisini kullanma veya kullanma

sales_flat_quote * tabloları alışveriş sepeti içeriğini içerir. Bu bir teklif olarak bilinir ve müşteri siparişi bitirmeye karar verene kadar bekletilir. Satış Siparişine dönüştürülmüş bitmiş teklifler için Magento, bunları otomatik olarak bir cron işi ile temizler. Mantık asla açık teklifleri içerecek şekilde genişletilmedi.


Diğer tablonun büyüklüğünün azaldığını görüyorum, bu yüzden basamaklı çalışıyor. AOE modülünü test edeceğim. Bu iyi bir ipucu!
SPRBRN

1
Bu senaryoyu limit 100000060 günden daha eski tüm kayıtlar bitene kadar birçok kez çalıştırdım . Sonra AOE Quote Cleaner modülünü kurdum. Web sitesi çalışmayı durdurduğu için AOE modülünü 20 metrelik silme işlemleri için kullanmadım - en azından test makinesinde. Senaryo herhangi bir sorun yaratmadı.
SPRBRN

1
Rica ederim! Fabrizio'nun modülü kullanılabilir hale gelmeden önce problemi çözmek zorunda kaldım ve böylece temizlikinize benzer bir şey yaptıktan sonra gözlemci rotasına gittim. Gövdeyi temizlemek yaklaşık 20 geçiş aldı. Şimdi planlanmış temizlik üzerinde, endişelenmeyin!
Fiasco Labs

Müşterinin var olmadığı bazı kayıtları silmek istiyorum.
Güzel Setia

1

Magento2'de, 'sales_flat_quote' yerine 'quote' yazılmıştır, bu nedenle aşağıdaki SQL komutu Magento2 için bu sorunu çözebilir:

update quote set items_count = NULL

1
Tür, @ DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
fiasco'nun

0

Fiasco Labs'ın çözümü işe yarıyor olsa da, sadece başlangıçtan itibaren bir uzantı ile başlıyorum Mage_Sales_Model_Quote_Resource_Collectionve daha eski seçim tırnaklarını filtrelemek ve kaldırmak için kullanıyorum . Uygun yöntemleri kullanarak, veritabanı kısıtlamalarına veya ham sorgulara dayanmadan işleminizin herhangi bir Magento kurulumunda çalışmasını sağlayabilirsiniz.

(Denenmemiş) gibi bir şey…

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

Bunu uzatabilir Mage_Logveya kendi başına uzantısını oluşturabilirsiniz. Gayet basit.


AOE'nin indirilmeye hazır çalışan bir modülü olduğunda neden kendi modülümü oluşturmak isteyeyim?
SPRBRN

1
AOE uzantıları harika, bu yüzden bunları hiç saymadım. Ancak size nedenleri belirtmek için .. 1.Uzantılarda manuel sorgu kullanmaktan kaçının. 2.Mümkünse uzantılarınızı bağımsız hale getirmeye çalışın. DELETEbunlar gibi sorgular, gelecekte değiştirilebilecek veritabanı kısıtlamasına bağlıdır. 3.Magento fabrika yöntemlerini uygun şekilde kullanın.
musicliftsme

Bir süre önce yapılmış gibi görünüyor @musicliftsme .. genellikle oldukça iyiler
Erfan

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

Bu sorgu, siparişlerde dönüştürülmeyen tüm teklifleri silecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.