Як поводитися з величезними таблицями sales_flat_quote - видалити покинуту відмову від кошика


13

Ситуація

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

  1. sales_flat_quote_shipping_rate: 3045MB
  2. sales_flat_quote_adadress: 1688MB
  3. продаж_котировка: 1897МБ

Це більше 6 ГБ даних.

Я знайшов цю статтю про те, як обрізати ці таблиці . Ця стаття говорить лише про третю таблицю.

Я не впевнений у обрізанні, і я вважаю за краще видалити всі дані, старші 60 днів. У статті йдеться про 17 мільйонів записів - у нас 20! Якщо я правильно, видалення цих записів не заблокує таблицю, і я зараз тестую це на тестовій установці. Це, здається, працює, і це не дуже конфліктує з сайтом.

Запитання

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

Відповіді:


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

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

Як тільки ви зменшите розмір, ви можете легко змінити спостерігача (обов’язково зробіть тут модуль), який повинен очистити терміни, що втратили чинність, щоб включити всі лапки, як це робиться у першому посиланні з налаштованим утриманням для відновлення покинутої кошика та збереження зареєстрованого в котируваннях клієнтів протягом розумного періоду, щоб ваші клієнти не зліли, коли їх кошик несподівано спорожняється: Чи не вилучені незавернені записи цитат у Magento?

або скористайтеся засобом очищення котирувань AOE Fabrizio Branca

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


Я бачу, що розмір іншої таблиці зменшується, тому каскад працює. Я збираюся перевірити модуль AOE. Це гарна порада!
SPRBRN

1
Я запускав цей сценарій багато разів, limit 1000000поки не зникли всі записи, старші за 60 днів. Потім я встановив модуль очищення AoE Quote Cleaner. Я не використовував модуль AOE для делетів 20 м, оскільки веб-сайт перестав працювати - принаймні на тестовій машині. Сценарій не створював жодних проблем.
SPRBRN

1
Ласкаво просимо! Мені довелося вирішити проблему ще до того, як модуль Fabrizio став доступним, і тому я пішов шляхом спостерігача, зробивши щось подібне до вашої очищення. На очищення пістолета знадобилося близько 20 проходів. Тепер, коли це заплановане прибирання, не хвилюйтесь!
Лабораторії Фіаско

Я хочу видалити деякі записи, клієнтів яких немає.
Lovely Setia

1

У Magento2 "sales_flat_quote" було замінено на "quotation", тому наступна команда SQL може виправити цю проблему для Magento2:

update quote set items_count = NULL

1
Начебто, змішуючись з відповіддю @ fiasco: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 готовий до завантаження робочий модуль?
SPRBRN

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.