Çok miktarda mysql verisinin çok düzenli bir şekilde verimli bir şekilde silinmesi


10

Herhangi bir zamanda yaklaşık 12 milyon satır içeren bir mysql masamız var. Tablonun boyutunu biraz yönetilebilir tutmak için eski verileri silmemiz gerekir.

Şu anda bu sorguyu bir cron işi kullanarak her gün gece yarısında çalıştırıyoruz:

DELETE FROM table WHERE endTime < '1393632001'

Sorgu son çalıştırıldığında 4.602.400 incelendi, 3 dakika sürdü ve CPU çatıdan geçti.

Geceyarısı CPU spiking

Eski verileri temizlerken CPU'nun, senkronize db bağlantılarının, disk ipucu derinliğinin vb. Makul olmayan bir şekilde yükselmesini önlemek için ne yapabiliriz?

Not: Sorgunun kullanım döngümüzde oldukça yetersiz bir zamanda gerçekleştiğini göreceksiniz. Sorgunun zamanlamasını her gün en düşük kullanım noktasında olacak şekilde değiştirdiğimizi varsayalım. Ayrıca, "endTime" üzerinde bir dizin yoktur ve ben çok düzenli olarak eklenen ve çok fazla arama bir ton veri var çünkü mümkünse bu şekilde tutmak tercih ederim.

php  mysql 

belki her 10 dakikada bir ve 100k veya 5 dakikada bir silmek için cron işlerini kullanın

daha küçük parçalar mı?

Tamam, ama öyle görünüyor ki sadece kullanıcı deneyimi uzun süre sakat olabilir :) sorgu / tasarım akıllıca yapabileceğimiz bir şey?

1
186k kullanıcı, özel bir db adam?

1
"Veritabanı Yöneticileri" hakkında daha iyi yanıtlar alacaksınız
James Anderson

Yanıtlar:


13

Sorununuzun çözümü, "bölümleme" adı verilen bir MySQL özelliğidir. Dokümantasyon burada .

Bölümleme, tek bir tabloyu ayrı "bölümlerde" depolamaktır. Bunlar, genellikle bir sütun değeri veya aralığı olan belirli bir ifade ile tanımlanır. Sizin durumunuzda, muhtemelen endTimebir kayıt oluşturulduğunda bilindiği ve değişmediği varsayılarak, bu temel alınacaktır .

endTimeHer bölümde bir günlük değeri depolarsınız . Daha sonra silme adımı, büyük bir tablodaki bir grup satırı silmek yerine bir bölümü kesiyor olacaktır. Bölüm kesmesi çok daha hızlı bir yöntem olacaktır.


vay, bu inanılmaz yardımcı oldu ve mükemmel bir çözüm gibi görünüyor. Bölümleme okuma zamanı! Teşekkürler!

Bölümleme iyi bir çözüm olsa da, ek yüke dikkat edin - sorgularınızı önemli ölçüde yavaşlatabilir. Ayrıca kesik tablo anında da değil. Pt-arşivleyiciyi düşünürdüm.
Dikenli
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.