Cara menangani tabel sales_flat_quote yang sangat besar - menghapus sampah yang ditinggalkan

13

Situasi

Dalam database magento kami, kami memiliki tiga tabel yang tumbuh terlalu besar.

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

Itu lebih dari 6GB data.

Saya telah menemukan artikel ini tentang cara memotong tabel ini . Artikel ini hanya berbicara tentang tabel ketiga.

Saya tidak yakin tentang pemotongan, dan saya lebih suka menghapus semua data yang lebih tua dari 60 hari. Artikel itu berbicara tentang 17 juta catatan - kami memiliki 20! Jika saya benar, menghapus catatan ini tidak akan mengunci tabel, dan saya sedang menguji ini pada instalasi pengujian. Itu sepertinya berhasil, dan itu tidak terlalu bertentangan dengan situs.

Pertanyaan

  • Saya ingin tahu apakah saya dapat menggunakan kueri yang sama untuk dua tabel lainnya juga?
  • Saya ingin tahu untuk apa tabel-tabel ini.
SPRBRN
sumber

Jawaban:

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

sales_flat_quote dan itu tabel terkait menggunakan hubungan kunci asing untuk menghapus pada kaskade sehingga penghapusan di tabel utama menghapus semua entri terkait secara otomatis di tabel lainnya.

Setelah Anda turunkan ukurannya, Anda dapat dengan mudah memodifikasi pengamat (wajib membuat modul di sini) yang seharusnya membersihkan tanda kutip kedaluwarsa untuk memasukkan semua kutipan seperti yang dilakukan di tautan pertama dengan retensi khusus untuk pemulihan keranjang yang ditinggalkan dan retensi yang dicatat dalam kutipan pelanggan untuk jangka waktu yang wajar sehingga pelanggan Anda tidak marah ketika keranjang mereka kosong secara tak terduga: Apakah catatan kutipan yang belum dikonversi pernah dihapus di Magento?

atau gunakan Pembersih Kutipan AOE dari Fabrizio Branca

sales_flat_quote * tabel berisi konten keranjang belanja. Ini dikenal sebagai kutipan dan ditahan sampai pelanggan memutuskan untuk selesai menempatkan pesanan. Untuk kutipan yang telah dikonversi ke Sales-Order, Magento secara otomatis menghapusnya dengan pekerjaan cron. Logikanya tidak pernah diperluas untuk memasukkan kutipan terbuka.

Laboratorium Fiasco
sumber
Saya melihat bahwa ukuran tabel lainnya berkurang, sehingga cascading berfungsi. Saya akan menguji modul AOE. Itu tip yang bagus!
SPRBRN
1
Saya menjalankan skrip itu berkali-kali, dengan limit 1000000, sampai semua catatan yang lebih dari 60 hari hilang. Kemudian saya menginstal modul AOE Quote Cleaner. Saya tidak menggunakan modul AOE untuk menghapus 20m, karena situs web berhenti bekerja - setidaknya pada mesin uji. Script tidak menimbulkan masalah.
SPRBRN
1
Sama-sama! Saya harus mengatasi masalah jauh sebelum modul Fabrizio tersedia dan jadi pergi pengamat rute setelah melakukan sesuatu yang mirip dengan pembersihan Anda. Butuh sekitar 20 operan untuk membersihkannya. Sekarang sudah dijadwalkan pembersihan, jangan khawatir!
Fiasco Labs
Saya ingin menghapus beberapa catatan yang tidak ada pelanggan.
Lovely Setia
1

Di Magento2, 'sales_flat_quote' diganti dengan 'quote', jadi mengikuti perintah SQL dapat memperbaiki masalah ini untuk Magento2:

update quote set items_count = NULL
Agilox
sumber
1
Jenis, pencampuran dengan jawaban @ fiasco:DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
nicolallias
0

Meskipun solusi Fiasco Labs berhasil, saya hanya akan memulai dengan ekstensi langsung dari awal dan digunakan Mage_Sales_Model_Quote_Resource_Collectionuntuk memfilter dan menghapus tanda kutip lama dari pemilihan. Menggunakan metode yang tepat, Anda dapat memastikan operasi Anda akan bekerja pada setiap instalasi Magento dengan tidak bergantung pada kendala basis data atau permintaan mentah.

Sesuatu seperti (belum diuji) ...

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

Anda dapat memperpanjang ini Mage_Logatau membuat ekstensi yang berdiri sendiri. Cukup mudah.

musicliftsme
sumber
Mengapa saya ingin membuat modul sendiri ketika AOE memiliki modul yang siap untuk diunduh?
SPRBRN
1
Ekstensi AOE sangat bagus, jadi saya tidak mendiskreditkannya sama sekali. Tetapi untuk memberi Anda alasan .. 1.Hindari menggunakan kueri manual dalam ekstensi. 2.Cobalah untuk membuat ekstensi Anda mandiri, jika mungkin. DELETEpertanyaan seperti ini tergantung pada batasan basis data, yang dapat diubah di masa depan. 3.Gunakan metode pabrik Magento dengan tepat.
musicliftsme
Sepertinya itu dibuat beberapa waktu lalu @musicliftsme .. biasanya mereka cukup bagus
Erfan
0
DELETE FROM sales_flat_quote WHERE entity_id NOT IN (SELECT quote_id FROM sales_flat_order);

Kueri ini akan menghapus semua kutipan, yang tidak dikonversi dalam pesanan.

Styopchik
sumber