MongoDB'de dizinlerle çalışma

Üretim ortamlarında kaynakların çok sınırlı olduğu ve artık 5 yıl önce var olanlardan on kat daha güçlü sunucuların olduğu doğru, ancak bu bilgisayarların gücü arttıkça sorgu da arttı. veri.

Bir sorgunun çalıştırılması için gereken süreye bağlı olarak, kritik olup olmadığını söyleyebiliriz, ancak kritik olmasa bile, iyileştirme için her zaman küçük bir marj vardır, bununla birlikte yürütme saniyelerinden tasarruf edeceğiz. gün sonu dakikalara dönüştürülür, bu da bize kullanıcı deneyimini iyileştirme imkanı verir.

GereksinimlerBu öğreticiyi yürütmek için işlevsel bir kuruluma ihtiyacımız var. MongoDB komut konsolunda çalışabilmemiz için yeterli izinlerle.

Ayrıca bir ihtiyacımız var veri seti veya belgeler Koleksiyonumuzu doldurmak için geçmiş eğitimlerde bir başlangıç ​​veri seti sunduk, ancak buna sahip olmayanlar bunu kullanabilirler:

 db.guiamongo.insert ({"ad": "Maria", "yaş": "25", "cinsiyet": "Kadın", "ülke": "Kolombiya"}); db.guiamongo.insert ({"ad ":" Pedro "," yaş ":" 32 "," cinsiyet ":" Erkek "," ülke ":" Ekvador "}); db.guiamongo.insert ({" isim ":" Ramon "," yaş " : "18", "cinsiyet": "Erkek", "ülke": "Honduras"}); db.guiamongo.insert ({"ad": "John", "yaş": "22", "cinsiyet": "Erkek", "ülke": "Arjantin"}); db.guiamongo.insert ({"ad": "Rosa", "yaş": "45", "cinsiyet": "Kadın", "ülke": " Şili "," diller ": [" Esp "," Ing "," Fra "]});
Bununla küçük bir başlangıç ​​için yeterli olacak ve böylece aşağıda sunacağımız alıştırmalardan sonuçlar elde edeceğiz.

1. MongoDB'yi indeksleme


Dizin oluşturma veya dizinlerle çalışma, paylaşılan bir kavramdır. MongoDB ile veritabanları ilişkisel, yani bu kavram hakkında bir fikrimiz varsa, onun nasıl çalıştığını anlayabiliriz. MongoDB çok geçmeden, sadece belirli sözdizimine bağlı kalmamız gerekiyor.

Dizinlerle çalışmaKonsepte yabancıysak şunu da belirtmek gerekir ki; endeksler belirtmekten başka bir şey değildir. Veri tabanı Aramanızı daha verimli hale getirmek için bellekte hangi alanları kullanmalısınız, örneğin, adı verilen bir alan için geniş bir belge koleksiyonunu sorguluyorsak İsim, ideal olan bu alanı indekslemek olacaktır, böylece motor doğrudan o alan tarafından yönlendirilmesi gerektiğini bilir, böylece o alanı kullanan sorgular daha hızlı olmaya başlar.

üzerinde bir dizin oluşturmak için MongoDB yapmamız gereken işlevi kullanmak sağlamakIndex () ve parametre olarak bir belgeyi iletin JSON söz konusu dizine uymamız gereken belgemizin alanlarını veya özelliklerini belirten. Bunun küçük bir örneğine bakalım.

adında bir koleksiyonumuz olduğunu varsayalım. guiamongo ve name adında bir alan arıyoruz, kod şöyle olurdu:

 db.guiamongo.find ({“ad”: “Ad”})
Bu, özellikle hiçbir şeyi olmayan normal bir sorgudur, tek sorun, milyonlarca belge varsa çok yavaş olacağıdır, bu nedenle bir dizin oluşturmak için bunu yalnızca aşağıdaki gibi belirtmemiz gerekir:
 db.guiamongo.ensureIndex ({“ad”: 1})
Bununla sorgu için indeksi zaten oluşturduk, tekrar çalıştırırsak çok daha hızlı olacaktır. Bakalım konsolumuzda bu nasıl görünüyor MongoDB:

Dizini oluşturduğumuzda fark edebiliriz, MongoDB Bize fonksiyonumuzun durumunu ve uygulamadan önce ve sonra kaç tane indeksimiz olduğunu gösteren ve ayrıca bize alanı gösteren bir belge döndürür. tamam aşkım 1'de bu, yürütmenin başarılı olduğunu gösterir.

Önceki sorgu, tek bir alan için oldukça kullanışlıdır, ancak aşağıdakileri yaparsak:

 db.guiamongo.find ({"ad": "Ad", "yaş": {"$ gt": "20"}}). sort ({"yaş": - 1});
Anlıyoruz ki, bu durumda dizin Bir önceki artık çalışmıyor, çünkü sorgu, arama için farklı bir alan kombinasyonu kullanıyor, bu yüzden daha önce öğrendiklerimizi kullanarak yeni bir dizin oluşturmalıyız, bakalım nasıl olacak:
 db.guiamongo.ensureIndex ("ad": 1, "yaş": 1);
Şimdi Veritabanımızı aşağıdaki gibi kontrol edersek, koleksiyonda yeni bir indeksimiz olduğunu göreceğiz:

2. İndeks kullanımındaki dezavantaj


Kullanım ve birlikte çalışmanın büyük avantajlarına rağmen endekslerBunlar her zaman faydalı değildir, bu yüzden bu özelliği Veritabanımıza uygulamadan önce iyice analiz etmeliyiz.

En büyük dezavantajNS indekslerin kullanımında büyük dezavantaj motorun tabloya veya dizin listesine eklediğimiz yeni verileri içermesi gerektiğidir, bu nedenle her işlev yapıldığında sokmak () disk ve işlem kullanımını artırabilecek bir dizi bitişik işlem oluşturulacaktır.

Diğer bir dezavantaj, maksimuma sahip olmamızdır. Koleksiyon başına 64 dizin, Bu nedenle, Veritabanımızda mümkün olan en az miktarda çalışmalıyız, böylece sadece kesinlikle gerekli olanın kullanıldığından emin olmalıyız.

3. Bir indeksin ne zaman kullanılacağını nasıl bilebilirim?


Endeks kullanımının kısıtlamalarını ve dezavantajlarını bildiğimiz için, onları oluşturup oluşturmamamız gerektiğini bilmek için iyi bir alıştırma bu soru dizisini almaktır, eğer hepsini cevaplayabilirsek bir indeks oluşturmak için gerekli özelliklere sahibiz, diğer taraftan eğer yapamazsak durumu başka bir açıdan analiz etmemiz gerekecek, şu sorulara bakalım:

Hangi sorguları yapıyoruz?Durumun bir analizini yapmalıyız ve koleksiyonumuzda neler olduğunu görmeliyiz, bununla indekslere ihtiyacımız olup olmadığını veya yoksa belki bazılarını ortadan kaldırmamız gerektiğini öğreneceğiz.

Endekslerin doğru yönü nedir?İndekslerdeki verileri nasıl sıraladığımızı bilmemiz gerekiyor, alfabetik veya sayısal olarak, artan veya azalan ise, bu doğrudan indeksleme hızını etkiler.

Nasıl ölçeklenecek?Verilerimizin büyümesi hakkında düşünmeliyiz, çünkü bu şekilde yarın 10 veya 100 kat daha fazla veri ile bugün neyin işe yarayacağını bileceğiz.

Tabii ki bu sadece bir rehberdir, her uygulama yöneticisinin bu tür eğitimlere göre kriterlerinizi uygulamanız gereken özel ve çok özel durumları vardır, ancak veri optimizasyonu dünyasında bizi başlatmak için iyi bir rehberdir.

4. Gömülü belgeler içindeki dizinler


İçinde işleyebileceğimiz belgelerin yapısı MongoDB kendini karmaşık veri depolamaya borçludur, ihtiyacımız olan tüm veriler aynı seviyede olmayacaktır, bu yüzden oluşturma ihtiyacı gömülü belge dizinleri. Bu endeksler ile MongoDB Daha karmaşık yapılara sahip verileri indeksleyebileceksiniz.

Bir sonuç elde etmek için denilen şeyi kullanacağız. nokta gösterimi, gömülü belgelerin alanlarına bir noktadan bir nesnenin özellikleriymiş gibi erişmekten başka bir şey değildir. Aşağıdaki örnekte bu özelliklerin bir indeksini oluşturacağız, öncelikle sözdizimini görelim.

İlk önce, test veri setimize gömülü bir belge içeren bir kayıt ekleyeceğiz:

 db.guiamongo.insert ({"ad": "Juan", "yaş": "40", "cinsiyet": "Erkek", "ülke": "Brezilya", "nitelikler": {"geçmiş": "85 "," edebiyat ":" 90 "," kurs ":" 3 "}});
Daha sonra bu durumda ders özelliği için basit bir sorgu yapacağız:
 db.guiamongo.find ({“grades.course”: ”3”});
Şimdi bir dizin oluşturmak istiyorsak aşağıdakileri yapmamız yeterlidir:
 db.guiamongo.ensureIndex ({“grades.course”: 1});
Bununla, bir koleksiyonda başka bir belgenin içine gömülü bir belgenin dizinini zaten oluşturduk. MongoDB. Buna bakarsak, konsolda elde etmemiz gereken şey:

5. Açıklamayı kullanın ()


İndeksleri nasıl oluşturacağımızı bildiğimiz ve onları ne zaman ve neden oluşturmamız gerektiğine dair bir fikrimiz olduğu için, henüz çok önemli, biraz daha fazla bilgi sahibi olmamızı ve daha da ileri gitmemizi sağlayan bir araç görmedik. sorgularımız; atıfta bulunuruz açıklamak () bu fonksiyon, sorgularda kullanılan zamanı ve indeksleri bilmemizi sağlar.

Bize ne söylüyor?dönüşü açıklamak () Arama için kullandığı imleci belirteceği bir belgedir, ardından dizinin sınırlarını belirtir, ayrıca adı olan bir alanımız var. milis ve bir sorgunun yürütülmesi için geçen süreyi milisaniye cinsinden gösterecektir, ikincisi, sorgumuzun performansını anlamak için çok önemlidir. Veri tabanı.

Şimdi bu fonksiyonu bir sorguya nasıl uygulayabileceğimize bakalım, önceki örneğimizde yaptığımızı kullanacağız:

 db.guiamongo.find ({“grades.course”: ”3”}).açıkla ();
Uygulamasından sonra aşağıdaki gibi bir şey döndürmelidir:

Sorguyu analiz edebilmek için verilerin bize nasıl sunulduğunu not ederiz. imleç adlı önceki alıştırmada oluşturduğumuz dizini kullandığımızı görüyoruz. notlar.course_1, bu oraya ulaşmamıza yardımcı oldu 0 mili saniye sorgularımız için en uygun zaman olan yürütme süresi, tabii ki burası bir test ortamı olduğu için bunun ötesinde bir şeyimiz olmayacak, ancak bu alıştırmayı milyonlarca kaydı olan sunucularda yapabilirsek, indekslerin gücünü fark edeceğiz.

Bununla bu öğreticiyi bitirdik, oluşturduk endeksler belge koleksiyonlarımızda ve ek olarak, performansımızı iyileştirmek ve hepsinden önemlisi artırmak için önemli bilgileri elde etmemize yardımcı olan bazı araçları araştırdık. Veri tabanı.

wave wave wave wave wave