Cómo manejar enormes tablas sales_flat_quote: eliminar los desechos de carritos abandonados


13

Situación

En nuestra base de datos de magento tenemos tres tablas que están creciendo demasiado.

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

Eso es más de 6 GB de datos.

Encontré este artículo sobre cómo truncar estas tablas . Este artículo solo habla de la tercera tabla.

No estoy seguro acerca del truncamiento, y prefiero eliminar todos los datos anteriores a 60 días. El artículo habla de 17 millones de registros, ¡tenemos 20! Si estoy en lo cierto, eliminar estos registros no bloqueará la tabla, y actualmente estoy probando esto en una instalación de prueba. Eso parece funcionar, y no entra en conflicto con el sitio.

Preguntas

  • ¿Me gustaría saber si puedo usar la misma consulta para las otras dos tablas también?
  • Me pregunto para qué son estas tablas.

Respuestas:


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

sales_flat_quote y sus tablas relacionadas usan relaciones de clave externa para eliminar en cascada, por lo que las eliminaciones en la tabla primaria eliminan automáticamente todas las entradas relacionadas en las otras tablas.

Una vez que lo reduzca de tamaño, puede modificar fácilmente el observador (obligatorio hacer un módulo aquí) que se supone que limpia las citas caducadas para incluir todas las citas como se hace en el primer enlace con retención personalizada para la recuperación del carro abandonado y la retención de logueado en las cotizaciones de los clientes por un período razonable para que sus clientes no se enojen cuando su carro se vacía inesperadamente: ¿Se eliminan los registros de cotizaciones no convertidos en Magento?

o use el limpiador de cotizaciones AOE de Fabrizio Branca

Las tablas sales_flat_quote * contienen el contenido del carrito de compras. Esto se conoce como una cotización y se mantiene hasta que el cliente decida terminar de hacer el pedido. Para las cotizaciones terminadas que se han convertido a Pedido de ventas, Magento las borra automáticamente con un trabajo cron. La lógica nunca se extendió para incluir comillas abiertas.


Veo que el tamaño de la otra tabla disminuye, por lo que funciona la conexión en cascada. Voy a probar el módulo AOE. Ese es un buen consejo!
SPRBRN

1
Ejecuté esa secuencia de comandos muchas veces, limit 1000000hasta que todos los registros de más de 60 días desaparecieron. Luego instalé el módulo AOE Quote Cleaner. No utilicé el módulo AOE para las eliminaciones de 20 m, ya que el sitio web dejó de funcionar, al menos en la máquina de prueba. El guión no planteó ningún problema.
SPRBRN

1
¡De nada! Tuve que abordar el problema mucho antes de que el módulo de Fabrizio estuviera disponible y así fue la ruta del observador después de hacer algo similar a su limpieza. Se necesitaron alrededor de 20 pases para despejar la suciedad. Ahora que está en la limpieza programada, ¡no se preocupe!
Fiasco Labs

Quiero eliminar algunos registros que el cliente no existe.
Lovely Setia

1

En Magento2, el 'sales_flat_quote' fue reemplazado por 'quote', por lo que el siguiente comando SQL puede solucionar este problema para Magento2:

update quote set items_count = NULL

1
Algo así como, mezclando con la respuesta de @ fiasco:DELETE FROM quote WHERE updated_at < DATE_SUB(Now(),INTERVAL 60 DAY)
nicolallias

0

Aunque la solución de Fiasco Labs funciona, simplemente comenzaría con una extensión desde el primer momento y la usaría Mage_Sales_Model_Quote_Resource_Collectionpara filtrar y eliminar las citas anteriores de elección. Usando los métodos adecuados, puede asegurarse de que su operación funcionará en cualquier instalación de Magento al no depender de restricciones de la base de datos o consultas sin formato.

Algo como (no probado) ...

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

Puede ampliar esto Mage_Logo hacer su propia extensión independiente. Bastante simple.


¿Por qué querría crear mi propio módulo cuando AOE tiene un módulo de trabajo listo para descargar?
SPRBRN

1
Las extensiones AOE son geniales, así que no las desacredito en absoluto. Pero para darle razones ... 1.Evite usar consultas manuales en extensiones. 2.Intenta que tus extensiones sean independientes, si es posible. DELETEconsultas como estas dependen de la restricción de la base de datos, que puede modificarse en el futuro. 3.Utilice los métodos de fábrica de Magento adecuadamente.
musicliftsme

Parece que esa se hizo hace un tiempo @musicliftsme ... por lo general son bastante buenos
Erfan

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

Esta consulta eliminará todas las comillas, que no se convirtieron en pedidos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.