2008-11-26 20 views
5

FormunMySQL'de yinelenen blob satırlarını nasıl etkin bir şekilde bulabilirim?

CREATE TABLE data 
{ 
    pk INT PRIMARY KEY AUTO_INCREMENT, 
    dt BLOB 
}; 
yaklaşık 160,000 sıralıdır

ve damla sütununa veri 2 GB (ort. Damla başına 14 KB) kadar bir tablo. Başka bir tablonun bu tablonun dış anahtarları var.

Blobların 3000'i gibi bir şey aynıdır. Yani istediğim, kopyaları çıkarmama izin verecek bir yeniden harita tablosu verecek bir sorgu.

naif yaklaşım 30-40k satırda yaklaşık bir saat sürdü: Ben var ne

SELECT a.pk, MIN(b.pk) 
    FROM data AS a 
    JOIN data AS b 
    ON a.dt=b.dt 
    WHERE b.pk < a.pk 
    GROUP BY a.pk; 

, başka nedenlerden dolayı, lekeler boyutları vardır bir tablo:

CREATE TABLE sizes 
(
    fk INT, // note: non-unique 
    sz INT 
    // other cols 
); 

Hem fk hem de başka bir sz için indeksler oluşturarak, bunun doğrudan sorgusu 50k satırlarla yaklaşık 24 saniye sürer:

Ancak bu, da (veri tablosu) üzerinde tam bir tablo taraması yapıyor. İsabet oranının oldukça düşük olması gerektiğini düşünürsek, bir endeks taramasının daha iyi olacağını düşünürdüm. Bunu göz önünde bulundurarak, bunu elde etmek için 5. bir katmanın 3. kopyasını ekledi ve yaklaşık 3 sn kaybetti.

Soru için OK: İkinci seçimden daha iyi mi olacağım? Varsa nasıl?

Birazcık bir sonuç: Anahtar sütunun çok ağır kullanıldığı ancak geri kalanının yalnızca nadiren kullanılmasının gerektiği bir tablonun olması durumunda, indeks taramasını teşvik etmek için o tablonun başka bir katılımını eklemekten daha iyi olacağım Tam bir tablo taraması mı? #[email protected] üzerinde


xgc boyutları gibi ama fk benzersiz kısıtlama ile bir yardımcı tablo ekleyerek çok yardımcı olabileceğini işaret ediyor. Tetikleyicileri ile bazı eğlence ve güncel tutmak için kötü olmasa bile ne yapamazsınız.

cevap

10

Verileriniz için her zaman bir karma işlevini (MD5 veya SHA1) kullanabilir ve daha sonra karmaları karşılaştırabilirsiniz.

Sorguları veritabanınıza kaydedebilir misiniz?

+0

+1: Buna katılıyorum. Sorgu her defasında bayt karşılaştırması için bayt yapmak zorunda kalırsanız. Kayıtlara ekleyen kodun da bunları karıştırmasını ve varolan tüm satırlar için karma oluşturduğundan emin olun. Artık sadece blob boyutlarını ve karmalarını karşılaştırmanız gerekiyor. –

+0

+1: En etkili yol gibi görünüyor (en azından gerçekte karşılaştırmak için ihtiyacınız olan BLOB'ların sayısını daraltacaktır). – scraimer