Как работать с огромными таблицами sales_flat_quote - убрать оставленную корзину


13

ситуация

В нашей базе данных magento у нас есть три таблицы, которые становятся слишком большими.

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

Это более 6 ГБ данных.

Я нашел эту статью о том, как обрезать эти таблицы . Эта статья говорит только о третьей таблице.

Я не уверен насчет усечения, и я предпочитаю удалять все данные старше 60 дней. В статье говорится о 17 миллионах записей - у нас 20! Если я прав, удаление этих записей не приведет к блокировке таблицы, и в настоящее время я тестирую это на тестовой установке. Кажется, это работает, и это не слишком конфликтует с сайтом.

Вопросов

  • Я хотел бы знать, могу ли я использовать тот же запрос для других двух таблиц?
  • Мне интересно, для чего эти таблицы.

Ответы:


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

sales_flat_quote и связанные таблицы используют отношения внешних ключей для удаления на каскаде, поэтому при удалении из первичной таблицы все связанные записи автоматически удаляются из других таблиц.

Как только вы уменьшите его в размерах, вы можете легко изменить наблюдателя (здесь обязательно создайте модуль), который должен очистить цитаты с истекшим сроком, чтобы включить все цитаты, как это сделано в первой ссылке с настраиваемым хранением для восстановления брошенной корзины и сохранением зарегистрированных в кавычках клиентов в течение разумного периода времени, чтобы ваши клиенты не рассердились, когда их корзина неожиданно опорожняется: удаляются ли когда-нибудь не обращенные записи кавычек в Magento?

или используйте очиститель цитат AOE Фабрицио Бранки

sales_flat_quote * таблицы содержат содержимое корзины. Это известно как предложение и удерживается до тех пор, пока клиент не решит завершить оформление заказа. Для готовых кавычек, которые были преобразованы в Sales-Order, Magento автоматически очищает их с помощью задания cron. Логика никогда не была расширена, чтобы включать открытые кавычки.


Я вижу, что размер другой таблицы уменьшается, поэтому работает каскадирование. Я собираюсь проверить модуль AOE. Это хороший совет!
СПРБР

1
Я запускал этот сценарий много раз, limit 1000000пока все записи старше 60 дней не исчезли. Затем я установил модуль очистки цитат AOE. Я не использовал модуль AOE для 20-минутного удаления, так как веб-сайт перестал работать - по крайней мере, на тестовой машине. Сценарий не представляет никаких проблем.
СПРБР

1
Пожалуйста! Мне пришлось заняться проблемой еще до того, как модуль Фабрицио стал доступен, и я пошел по пути наблюдателя, выполнив нечто похожее на вашу очистку. Потребовалось около 20 проходов, чтобы очистить грязь. Теперь, когда это запланировано, не беспокойтесь!
Fiasco Labs

Я хочу удалить некоторые записи, которых нет у клиента.
Прекрасная 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)
nicolallias

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 есть рабочий модуль, готовый к загрузке?
СПРБР

1
Расширения AOE великолепны, поэтому я их совсем не дискредитирую. Но для объяснения причин. 1.Избегайте использования ручных запросов в расширениях. 2.Постарайтесь сделать ваши расширения независимыми, если это возможно. DELETEПодобные запросы зависят от ограничений базы данных, которые могут быть изменены в будущем. 3.Используйте фабричные методы Magento соответствующим образом.
musicliftsme

Похоже, что это было сделано некоторое время назад @musicliftsme .. обычно они довольно хороши
Эрфан

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

Этот запрос удалит все кавычки, которые не конвертированы в заказы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.