NoSQL neden SQL'den daha hızlı?


48

Son zamanlarda bana istendi:

NoSQL neden SQL'den daha hızlı?

Sorunun öncülüne katılmamıştım ... şahsen benim için saçmalık. SQL yerine NoSQL kullanarak performans artışı göremiyorum. Belki NoSQL üzerinden SQL, evet ama bu şekilde değil.

NoSQL hakkında bir şey eksik mi?


3
Performans artışı göremiyorsanız, söylediğiniz şey budur. İşin aslı, NoSQL çözümlerinin çoğunun ilişkisel bir veritabanının ACID özelliklerinden birini (veya daha fazlasını) gerektirmesidir, bu yüzden daha az yaparlar.
Oded

1
Geleneksel bir ACID etkin ilişkisel veritabanına kolayca eşlenemeyen bazı iş akışları (ve veri yapıları) vardır. Bunlar için NoSQL veritabanı kullanarak büyük performans artışları görebilirsiniz . Bununla birlikte, yalnızca mevcut (iyi tasarlanmış) bir SQL DB'yi alır ve bir NoSQL Veritabanına koyarsanız, performansınız kesinlikle zarar görür.
Joachim Sauer

1
Cevap: Daha hızlı kuruldu mu? Ve ne içinde daha hızlı? Gelişme zamanı? Okuma zamanı? Zaman yaz Hangi yazı tipi? Neyle karşılaştırıyoruz? Çok masalı sorgular? Katıldı?
Rolf

Yanıtlar:


65

Her birinin kendine özgü güçlü ve zayıf yönleri olan birçok NoSQL çözümü vardır, bu nedenle aşağıdakilerin bir tuz tuzu ile alınması gerekir.

Ancak, esasen, birçok NoSQL veritabanının yaptığı, denormalizasyona dayanmak ve denormalize edilmiş durum için optimize etmeye çalışmaktır. Örneğin, bir blog gönderisini, yorumlarıyla birlikte belge odaklı bir veritabanında okuduğunuzu varsayalım. Çoğu zaman, yorumlar gönderinin kendisi ile birlikte kaydedilir. Bu, aynı yerde depolandıkları için hepsini bir araya getirmenin daha hızlı olacağı ve bir birleşme gerçekleştirmeniz gerekmediği anlamına gelir.

Elbette, SQL'de de aynı şeyi yapabilirsiniz ve performansa ihtiyaç duyulduğunda normalleştirme normal bir uygulamadır. Sadece birçok NoSQL çözümü her zaman bu şekilde kullanılacak şekilde tasarlandı. Daha sonra olağan takaslar elde edersiniz: örneğin yukarıdaki örnekte bir yorum eklemek daha yavaş olacaktır çünkü tüm belgeyi onunla birlikte kaydetmeniz gerekir. Ve bir kez normalize edildikten sonra, uygulamanızdaki veri bütünlüğünü korumaya özen göstermelisiniz.

Ayrıca, birçok NoSQL çözümünde, isteğe bağlı katılımlar, dolayısıyla isteğe bağlı sorgular yapmak mümkün değildir. CouchDB gibi bazı veritabanları, ihtiyaç duyacağınız sorguları önceden düşünmenizi ve bunları DB içinde hazırlamanızı gerektirir.

Sonuç olarak, bu denormalize bir şema beklemek ve bu durum için okumaları optimize etmekle kaynaşıyor ve bu durum yüksek derecede ilişkisel olmayan ve yazı yazmaktan daha fazla okuma gerektiren veriler için iyi çalışıyor.


4
Bu arada, tüm SQL iyiliğinden faydalanırken, basitleştirilmiş bir görünüme ya da bir önbellek katmanına sahip olarak gerçekleştirilebilir. Düzgün bir şekilde modellenen herhangi bir şey ilişkiseldir ve mantıksal veri çoğaltılması bir çözüm değildir (mat. Görünüm bir çoğaltmadır ancak mantıksal bir çoğaltma değildir, çünkü başka bir şeyin görüntüsüdür).
Morg.

Cevapta söylediğim gibi, SQL'de aynı şey yapılabilir; sadece istisnalar yerine kural olunca, NoSQL veritabanları genellikle daha hızlı ve daha doğaldır. Teoride, SQL, kullanabileceği en iyi modeldir, ancak veriler belirli bir boyutta büyüyünce, sadece bazı modellere uyum sağlayamaz ve veri çoğaltmanın nedenleri hızlı ve kolay hale gelir.
Andrea

3
Bu boğa. İlişkisel model NoSQL'de yapabileceğiniz her şeyi ve daha fazlasını içerir. NoSQL'in tek avantajı, ölçeklendirmeye basit ve tutarsız bir yaklaşımın dahil edilmiş ve kullanımı kolaydır. SQL ile ilgisi yok ve ACID özelliklerini önemsememekle ilgisi yok. NoSQL depolarının sahip olduğu tamamen aynı (çok kötü) ölçeklendirme ve tutarlılık özelliklerine sahip olacak olan bağımsız SQL düğümleri arasında eşitleme işleri yapabilirsiniz. Fark, eğer isterseniz SQL düğümlerinin ALSO’nun tutarlılığı olabilir.
Morg.

1
Ya 5.000.000 milyon veri satırınız varsa ve bir şartla hepsinden yorum almak istiyorsanız. Tablonun yorum alanına SQL ile bir indeks vermeniz daha hızlı olmaz mıydı? Tam Metin indekslemesi bunu daha da iyileştirirdi.
15'te

@morg - "İlişkisel model, NoSQL'de yapabileceğiniz her şeyi ve daha fazlasını içerir." Gerçekten değil, hayır. Verileri içine zorlayan büyük verimsizlikle sonuçlanan ilişkisel modele bu kadar kötü gelen birçok veri örneği örneği vardır. Örnek: Bir çevrimiçi oyunda oyuncuların envanterini depolamak için bir tesis bulunur. Oyuncular, her biri belirli bir tipte bir veya daha fazla eşya saklayabilen sınırlı sayıda numaralandırılmış slot setine sahiptir. Her biri 4-6 ilişkili özelliğe sahip, bazıları örtüşen yaklaşık 50 farklı öğe türü vardır, bu yüzden 80 olası özellik vardır ...
Jules

27

NoSQL hakkında kaçırdığınız şey, NoSQl'nin SQL ile hiçbir şekilde karşılaştırılamayacağıdır. NoSQL, SQL olmayan tüm kalıcılık teknolojilerinin adıdır. Belge DB'leri, Anahtar Değer DB'leri, Olay DB'leri hepsi NoSQL'dir. Neredeyse her yönden hepsi farklıdır; kaydedilen verinin yapısı, sorgulama, performans ve kullanılabilir araçlar.

Öyleyse eğer biri size röportajda böyle bir soru sorarsa, cevap bu olmalıdır.


4
NoSQL'in bir katil özelliği varsa, bunun ölçeklenebilirlik olduğunu söyleyebilirim. Bu yüzden Facebook'lar ve Googles onu kullanıyor. Verilerin devasa hacmi nedeniyle. NoSQL: muazzam miktarda Veri ile uğraşmak zorunda olduğunuzda.
Pieter B

16

'NoSQL' (ya da daha doğrusu: ilişkisel olmayan) veritabanları hız için geleneksel veritabanlarının bazı özelliklerinden vazgeçmezler, daha da önemlisi yatay ölçeklenebilirlik için.

Eksik olan özellikler beton ürüne, genel olarak tam ACID özelliklerine ve hatta birleştirme işlemlerine bağlı olarak desteklenmemektedir. Artan performansın bedeli budur.


1
NoSQL'i ilişkisel olmayan olarak tanımlamak daha kesin değildir. NoSQL kategorisine girmeyen diğer eski ilişkisel olmayan DB'ler var. NoSQL, ilişkisel olmayan ilişkiden çok daha fazlasını ifade eder. Daha fazla bilgi için bunu okuyun: martinfowler.com/bliki/NosqlDefinition.html
eddyP23

8

Haklısın, bunu bir battaniye ifadesinde belirtmek saçma olur. Muhtemelen bütün mesele budur; Tek bir cevap yerine, görüşmeci muhtemelen sorunun bağlamının ne olduğunu (ne tür veriler, ne kadarının, hangi işletim ortamında vb.) ve belirli NoSQL çözümünü belirlemenize yardımcı olacak sorularla cevap vermenizi beklemektedir. . Problemleri nasıl analiz ettiğinizi bulmaya çalışacaklar ve bu süreçte ortaya çıkan farklı çözümler hakkında ne kadar bilginiz olduğu hakkında bir fikir edinecekler.


Evet, bir battaniye ifadesidir ve doğru olduğunu kabul edersek, sorunun cevabı şudur: bağlıdır.
Rolf

5

NoSQL veritabanları normalde yalnızca verilerinizi onların etrafında tasarlarsanız mantıklı olur.

Bunları basitçe bir RDBMS yedeği olarak kullanmak istiyorsanız, o zaman, özellikle de yüksek miktarda RAM içeren sunucular için ödeme yapacak kadar bütçeniz yoksa, daha çok değil, daha az performans elde edebilirsiniz.

MySQL disk alanı kullanımını MongoDB ile karşılaştıran bu makaleye bakın: http://blog.trackerbird.com/content/mysql-vs-mongodb-disk-space-usage


3

Hangi NoSQL veritabanı? Hangi SQL veritabanı? Birisi size NoSQL'in SQL'den daha hızlı olduğunu söylerse, o zaman uzaklaşmalısınız. Ya da daha iyisi bu videoyu izleyin:

http://www.youtube.com/watch?v=b2F-DItXtZs

NoSQL hakkında iddia edilen şeylerin yarısının yanlış olduğunu söylemeyeceğim, ancak orada gerçekten çok iyi anlamayan insanlardan çok sayıda NoSQL fanatiği olduğunu söyleyeceğim.

SQL'in sınırları var (elbette) ama aynı zamanda çok iyi bilinen bir teknolojidir, iyi anlaşılmıştır ve nasıl iyi kullanılacağını bilen büyük bir geliştirici havuzuna sahiptir. NoSQL'in tüm formları için aynı şeyi söyleyemem.


-2

NoSql, RDBMS'nin satır tabanlı veritabanı olduğu sütun tabanlı veritabanları tarafından desteklenir ... Örneğin, örneğin, Ad, Yaş, Salery, Adres, Çalışan vb. İçeren bir Çalışan tablomuz var. (NoSQL desteği). Bir müşteri / müşteri 1Lakh çalışan kayıtlarından ortalama Yaş veya Salery detaylarını almak için bir sorgu yazarsa ... ne olur?

RDBMS'de her satırın etrafında dolaşır ve elde ettiği değeri ve toplamı & böl. Columnar veritabanına gelince, tüm lakh satır yinelemeleri için endişelenmenize gerek yok. Ancak hesaplanması daha hızlı olan sadece bir Row ile uğraşın. Yani bu şekilde bazen NoSQL, SQL'den daha hızlıdır. Bu durumda NoSQL'in umursamadığı ACID şikayetlerine değer!


2
Şekillendirmeyi biraz düzelttim, ancak ikisi arasında ne yapmaya çalıştığınızdan emin değilim. Ve ACID de her zaman RDBMS tarafından desteklenmiyor.

-3

Veritabanlarının etrafındaki teoriyi unutun .... asıl sorgunuzu anladığınızda, nosql veritabanlarındaki verileri uygulamanızın gerçekte kullanıldığı şekilde kaydedebilirsiniz.

Örneğin, bu örneği ele alalım, çok sayıda sipariş ve her bir siparişle ilişkili birçok üründen oluşan bir müşteri modeliniz var, o zaman daha sonra satın alımlar için çok sayıda kaydedilmiş öğeye sahip olacaksınız ... eğer büyük bir e-ticaret mağazasıysanız, 10 milyon müşteri ve 50 milyon emir. Ve bu müşteri, bu kesin verileri görüntüleyen gösterge tablosuna giriş yapar, müşteriyi bulmak, siparişlere katılmak ve her satır öğesine ve kaydedilmiş öğelere katılmak için gerekecek bir sql veri tabanının ne kadar işe yaradığını gösterir. Bir sql veritabanında tüm bu verilerin bir şekilde birleştirilmesi gerekebilir ... veya ur veritabanında usercache adlı bir koleksiyon oluşturabilir ve bu verileri tam olarak gerçek hayatta nasıl kullanacağınızı kaydedebilirsiniz. Bu nedenle, bu verilerin tümünü geri almak için bu, tek bir alanda [id] gerçekten tek bir sorgu olabilir. Bunun üzerine nosql veritabanı yok '

Bir sql db, nosql'den daha hızlı değilse, tek bir ID alanını sorgulayabiliyor mu? Evet, ancak bir sql veritabanı ihtiyacınız olan tüm verileri bir tabloyu ve bir alanı sorgulayarak döndürebilir mi? Hayır, Json'daki verileri büyük bir metin alanına kaydetmek gibi bir şey yapmazsanız. Ancak şimdi bu veriler gelecekteki potansiyel kullanım için sorgulanabilir durumda değildir.

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.