巨大なsales_flat_quoteテーブルを処理する方法-放棄されたカートのゴミを取り除く


13

状況

magentoデータベースには、3つのテーブルが大きくなりすぎています。

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

それは6GB以上のデータです。

これらのテーブルを切り捨てる方法に関するこの記事を見つけました。この記事では、3番目のテーブルについてのみ説明します。

切り捨てについてはわかりませんが、60日より古いすべてのデータを削除することを好みます。記事は1700万件の記録を語っています-私たちには20件あります!私が正しい場合、これらのレコードを削除してもテーブルはロックされません。現在、テストインストールでこれをテストしています。それはうまくいくようで、サイトとあまり競合しません。

ご質問

  • 他の2つのテーブルにも同じクエリを使用できるかどうか知りたいですか?
  • これらのテーブルは何のためにあるのでしょうか。

回答:


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

sales_flat_quote また、関連テーブルは外部キーリレーションを使用してカスケードで削除するため、プライマリテーブルで削除すると他のテーブルのすべての関連エントリが自動的に削除されます。

サイズを小さくしたら、最初のリンクで行われたように、失効した見積もりを一掃するはずのオブザーバー(ここでモジュールを作成する必要があります)を簡単に変更できます。合理的な期間の顧客見積りで、カートが予期せず空になったときに顧客が怒らないようにします:未変換の見積レコードはMagentoで削除されますか?

またはFabrizio BrancaのAOE Quote Cleanerを使用します

sales_flat_quote *テーブルには、ショッピングカートの内容が含まれています。これは見積もりと呼ばれ、顧客が注文を完了することを決定するまで保持されます。Sales-Orderに変換された完成した見積もりの​​場合、Magentoはcronジョブでそれらを自動的にクリアします。ロジックがオープンクォートを含むように拡張されたことはありません。


他のテーブルのサイズが小さくなるので、カスケードが機能することがわかります。AOEモジュールをテストします。それは良いヒントです!
SPRBRN 14

1
limit 100000060日以上経過したすべてのレコードがなくなるまで、このスクリプトを何度も実行しました。次に、AOE Quote Cleanerモジュールをインストールしました。ウェブサイトが機能しなくなったため、少なくともテストマシン上では、20mの削除にAOEモジュールを使用しませんでした。スクリプトは問題を引き起こしませんでした。
SPRBRN 14

1
どういたしまして!Fabrizioのモジュールが利用可能になる前に問題に取り組む必要があったため、クリーンアップと同様の操作を行った後、オブザーバールートに進みました。ネバネバしたものを取り除くのに約20パスかかりました。スケジュールされたクリーンアップが行われたので、心配ありません!
Fiasco Labs

顧客が存在しないレコードをいくつか削除したい。
美しいセティア

1

Magento2では、「sales_flat_quote」が「quote」に置き換えられたため、次のSQLコマンドでMagento2のこの問題を修正できます。

update quote set items_count = NULL

1
種類、@ DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
fiasco

0

Fiasco Labsのソリューションは機能しますが、始めからすぐに拡張機能を使用Mage_Sales_Model_Quote_Resource_Collectionし、選択の古い引用をフィルタリングして削除するために使用します。適切な方法を使用すると、データベースの制約や生のクエリに依存することなく、Magentoのインストールで操作が機能することを確認できます。

(未テスト)のようなもの…

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

これを拡張しMage_Logたり、独自のスタンドアロン拡張を作成したりできます。ものすごく単純。


AOEにダウンロード可能なワーキングモジュールがあるのに、なぜ独自のモジュールを作成したいのですか?
SPRBRN 14

1
AOE拡張機能は素晴らしいので、私はそれらを信用しません。しかし、理由を示すために.. 1.拡張機能で手動クエリを使用することは避けてください。2.可能であれば、拡張機能を独立させてください。DELETEこのようなクエリはデータベースの制約に依存し、将来変更される可能性があります。3.Magentoのファクトリメソッドを適切に使用します。
musicliftsme 14

しばらく前に@musicliftsme ..が作成されたようです。通常はかなり良いです
-Erfan

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

このクエリは、注文で変換されていないすべての見積を削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.