如何处理巨大的sales_flat_quote表-删除废弃的购物车垃圾


13

情况

在我们的magento数据库中,我们有三个表太大了。

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

超过6GB的数据。

我找到了有关如何截断这些表的文章。本文只讲第三张桌子。

我不确定会被截断,因此我希望删除所有早于60天的数据。这篇文章谈到了1700万条记录-我们有20条!如果我是正确的话,删除这些记录将不会锁定该表,并且我目前正在测试安装中对其进行测试。这似乎可行,并且与网站没有太多冲突。

问题

  • 我想知道是否也可以对其他两个表使用相同的查询?
  • 我想知道这些表是干什么用的。

Answers:


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 *表包含购物车内容。这被称为报价,一直保留到客户决定完成下订单为止。对于已转换为销售订单的成品报价,Magento会使用cron作业自动清除它们。逻辑从未扩展为包括开放式引号。


我看到另一个表的大小减小了,所以级联起作用了。我将测试AOE模块。这是一个很好的提示!
SPRBRN 2014年

1
我使用多次运行了该脚本limit 1000000,直到所有超过60天的记录都消失了。然后,我安装了AOE Quote Cleaner模块。由于网站停止运行-至少在测试机上,我没有对这2000万个删除操作使用AOE模块。该脚本没有任何问题。
SPRBRN 2014年

1
别客气!在Fabrizio的模块可用之前,我不得不先解决问题,然后在进行类似于您的清理工作的观察者路线。花了大约20遍才能清除黑皮。现在,它已按计划进行清理,无需担心!
Fiasco Labs 2014年

我想删除一些客户不存在的记录。
可爱的Setia

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 2014年

1
AOE扩展很棒,所以我一点也不丢脸。但是请给您理由。. 1.避免在扩展程序中使用手动查询。2.如果可能,请尝试使您的扩展独立。DELETE此类查询取决于数据库约束,将来可能会更改。3.适当使用Magento工厂方法。
musicliftsme 2014年

好像一个被做了前一阵子@musicliftsme。通常他们是相当不错的
尔法恩

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

该查询将删除所有未按订单转换的报价。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.