2012-01-16 34 views
5

neden mysql'deki problemi çözüyor. Bu tabloya 100 dosya, her 100MB depolamak zamanMySQL SELECT çok yavaş çünkü LONGBLOB

table xxx 
-> id primary key 
-> name varchar 255 
-> data longblob 

, masa o

SELECT name FROM xxx WHERE id = 50 LIMIT 1; 

alır uzun sürer ... herhangi satırı seçmek için deneyin

10GB

zorunda kalacak ve suçlu yaklaşık 8 saniye

Sorunum muhtemelen, mysql, name, sadece 255 karaktere dönmeden önce tüm satırı okur ... bu yüzden 100 dosya adlarını listelemek istiyorum, m ysql 10 GB okur ve 2 KB sonucunu döndürür.

+0

StackExchange siz yazarken soru/cevap önizlemesini gösterir. Lütfen önizlemeye bakın ve biçimlendirmenin doğru olduğundan emin olun. Önceden biçimlendirilmiş kod, önizlemede tek bir satır olarak görüntülenirse, diğerlerine bu şekilde bakar. Bu yüzden düzgün şekilde biçimlendirmek için "kod örneği" düğmesini kullanın (ya da her satırdan önce 4 boşluk koyun ve SE önceden biçimlendirilmiş kodu bilecektir). –

cevap

6

Blobları ayrı bir tabloya ayırmayı deneyin.

Örneğin, sütunlar id ve name ve sütunları id ve data içeren başka tablo xxx_data içeren bir tablo xxx olabilir. Sadece ismi istiyorsan, xxx_data tablosunu sorgulamana gerek yok;

Daha fazla bilgi ve optimizasyon fikirleri için
SELECT id, name, data 
FROM xxx JOIN xxx_data USING (id) 
WHERE id = ... 

, bakınız örn: isim ve verileri hem gerekiyorsa, birlikte paylaşılan birincil anahtar id kullanarak tabloları katılabilir 10 tips for optimizing MySQL queries.

+2

Sadece bu dosyaların veritabanında bunun yerine dosya sisteminde saklamayı düşünmeniz gerekenleri ekleyebilirim. Tabii ki bunları veritabanında saklamak için nedenler var (güvenlik, kolay silme, birçok sunucuda kolay çoğaltma vb.) Ancak 10 dosya döndürmek istediğinizi düşünün ... veritabanını sorgulayın ve 10 * 100MB saklayın hafıza. Sunucuda yalnızca 1GB RAM tüketmek istiyor musunuz, sadece dosyaları geri yüklemek için bunları sunucunuzdaki bazı konumlardan aktarabiliyor musunuz? Dosyalarınızın veritabanında saklanmak için çok büyük olduğunu düşünüyorum. –

+1

Veritabanındaki verilere kesinlikle ihtiyacınız yoksa, dosyayı dosya sistemine de taşıyabilirsiniz. Büyük miktarda dosya veya büyük dosya ile uğraşırken, bu daha iyi çalışır. –