MongoDB ilə işə başlamazdan əvvəl bilmək istədiyim 14 şey

Məqalənin tərcüməsi kursun başlaması ərəfəsində hazırlanıb "Qeyri-əlaqəli verilənlər bazaları".

MongoDB ilə işə başlamazdan əvvəl bilmək istədiyim 14 şey

Highlights:

  • MongoDB-də isteğe bağlı olsa da, sxem hazırlamaq son dərəcə vacibdir.
  • Eynilə, indekslər sxeminizə və giriş nümunələrinə uyğun olmalıdır.
  • Böyük obyektlərdən və böyük massivlərdən istifadə etməyin.
  • MongoDB parametrləri ilə diqqətli olun, xüsusən təhlükəsizlik və etibarlılığa gəldikdə.
  • MongoDB-də sorğu optimallaşdırıcısı yoxdur, ona görə də sorğu əməliyyatlarını yerinə yetirərkən diqqətli olmalısınız.

Mən çox uzun müddətdir verilənlər bazası ilə işləyirəm, lakin MongoDB-ni bu yaxınlarda kəşf etdim. Onunla işləməyə başlamazdan əvvəl bilmək istədiyim bir neçə şey var. İnsan artıq müəyyən bir sahədə təcrübəyə malik olduqda, verilənlər bazalarının nə olduğu və nə etdikləri ilə bağlı qabaqcadan fikirlərə malikdir. Başqalarının başa düşməsini asanlaşdırmaq ümidi ilə ümumi səhvlərin siyahısını təqdim edirəm.

Doğrulama olmadan MongoDB serverinin yaradılması

Təəssüf ki, MongoDB standart olaraq autentifikasiya olmadan quraşdırılır. Yerli olaraq daxil olan bir iş stansiyası üçün bu təcrübə normaldır. Lakin MongoDB böyük həcmdə yaddaşdan istifadə etməyi sevən çox istifadəçili sistem olduğundan, onu yalnız inkişaf üçün istifadə etsəniz belə, mümkün qədər çox RAM olan bir serverə yerləşdirsəniz, daha yaxşı olar. Serverdə standart port vasitəsilə quraşdırma problemli ola bilər, xüsusən də sorğuda hər hansı javascript kodu icra oluna bilərsə (məsələn, $where üçün ideya kimi inyeksiya).

Bir neçə autentifikasiya üsulu var, lakin ən asanı istifadəçi ID/parol təyin etməkdir. Əsasən dəbdəbəli autentifikasiya haqqında düşünərkən bu fikirdən istifadə edin LDAP. Təhlükəsizliyə gəldikdə, MongoDB daim yenilənməlidir və qeydlər həmişə icazəsiz giriş üçün yoxlanılmalıdır. Məsələn, mən standart port kimi fərqli bir port seçməyi xoşlayıram.

Hücum səthini MongoDB ilə bağlamağı unutmayın

MongoDB Təhlükəsizlik Yoxlama Siyahısı şəbəkəyə müdaxilə və məlumat sızması riskini azaltmaq üçün yaxşı məsləhətləri ehtiva edir. Bunu aradan qaldırmaq və bir inkişaf serverinin yüksək səviyyəli təhlükəsizliyə ehtiyac olmadığını söyləmək asandır. Bununla belə, bu o qədər də sadə deyil və bu, bütün MongoDB serverlərinə aiddir. Xüsusilə, istifadə etmək üçün heç bir ciddi səbəb yoxdursa mapReduce, group və ya $harada, konfiqurasiya faylına yazaraq JavaScript-də ixtiyari kodun istifadəsini söndürməlisiniz javascriptEnabled:false. Məlumat faylları standart MongoDB-də şifrələnmədiyi üçün MongoDB ilə işləmək məntiqlidir Xüsusi İstifadəçi, fayllara tam girişi olan, yalnız ona məhdud girişi və əməliyyat sisteminin öz fayla giriş nəzarətlərindən istifadə etmək imkanı olan.

Dövrəni inkişaf etdirərkən xəta

MongoDB sxemdən istifadə etmir. Amma bu o demək deyil ki, sxemə ehtiyac yoxdur. Əgər siz sadəcə sənədləri hər hansı ardıcıl nümunə olmadan saxlamaq istəyirsinizsə, onları saxlamaq tez və asan ola bilər, lakin sonradan onları geri qaytarmaq çətin ola bilər. lənətləmək çətindir.

Klassik məqalə "MongoDB Sxema Dizaynı üçün 6 Əsas Qaydalar" Oxumağa dəyər və kimi xüsusiyyətləri var Sxem Explorer üçüncü tərəf aləti Studio 3T-də dövrələrin müntəzəm yoxlanılması üçün istifadə etməyə dəyər.

Sıralama qaydasını unutmayın

Çeşidləmə qaydasını unutmaq hər hansı digər yanlış konfiqurasiyadan daha çox məyusluğa və daha çox vaxt itkisinə səbəb ola bilər. Varsayılan olaraq MongoBD istifadə edir ikili sort. Amma çətin ki, kimsə üçün faydalı olsun. Keçən əsrin 80-ci illərində muncuqlar, kaftanlar və buruq bığlarla birlikdə hərflərə həssas, vurğuya həssas, binar növlər maraqlı anaxronizmlər hesab olunurdu. İndi onların istifadəsi bağışlanmazdır. Real həyatda "motosiklet" ilə "motosiklet" eynidir. Və "Britaniya" və "Britaniya" eyni yerdir. Kiçik hərf sadəcə böyük hərfin böyük hərfinə bərabərdir. Və məni diakritikləri sıralamağa başlamayın. MongoDB-də verilənlər bazası yaradarkən vurğuya həssas olmayan birləşmədən istifadə edin və qeydiyyatdan keçin, dilə uyğun gələn və sistem istifadəçi mədəniyyəti. Bu, string data vasitəsilə axtarışı çox asanlaşdıracaq.

Böyük sənədlərlə kolleksiyalar yaradın

MongoDB, kolleksiyalarda 16MB-a qədər böyük sənədləri yerləşdirməkdən məmnundur və GridFS 16 MB-dan böyük sənədlər üçün nəzərdə tutulmuşdur. Amma orada böyük sənədlər yerləşdirilə bildiyi üçün onları orada saxlamaq yaxşı fikir deyil. MongoDB daha yaxşı işləyəcək, əgər siz bir neçə kilobayt ölçüsündə olan fərdi sənədləri saxlasanız və onlara daha çox geniş SQL cədvəlində sətirlər kimi baxsanız. Böyük sənədlər problem qaynağı olacaq performans.

Böyük massivlərlə sənədlərin yaradılması

Sənədlərdə massivlər ola bilər. Massivdəki elementlərin sayı dörd rəqəmli rəqəmdən uzaq olsa yaxşıdır. Elementlər massivə tez-tez əlavə edilərsə, o, onu ehtiva edən sənəddən çox böyüyəcək və hərəkət, bu o deməkdir ki, lazım olacaq indeksləri də yeniləyin. Böyük massivlə sənədi yenidən indeksləşdirərkən, indekslər çox vaxt üzərinə yazılacaq, çünki rekord, indeksini saxlayan. Bu yenidən indeksləşdirmə də sənəd daxil edildikdə və ya silindikdə baş verir.

MongoDB adlı bir şey var "doldurma faktoru", bu problemi minimuma endirmək üçün sənədlərin böyüməsi üçün yer təmin edir.
Siz hesab edə bilərsiniz ki, siz serialın indeksləşdirilməsi olmadan edə bilərsiniz. Təəssüf ki, indekslərin olmaması başqa problemlərə səbəb ola bilər. Sənədlər başdan sona skan edildiyi üçün massivin sonundakı elementlərin axtarışı daha uzun çəkəcək və belə bir sənədlə əlaqəli əksər əməliyyatlar yavaş.

Unutmayın ki, toplamada mərhələlərin ardıcıllığı vacibdir

Sorğu optimallaşdırıcısı olan verilənlər bazası sistemində yazdığınız sorğular onu necə əldə etməyiniz deyil, nə almaq istədiyinizin izahıdır. Bu mexanizm restoranda sifariş verməklə bənzətmə ilə işləyir: adətən siz sadəcə yemək sifariş edirsiniz və aşpaza ətraflı təlimat vermirsiniz.

MongoDB-də aşpaza göstəriş verirsiniz. Məsələn, məlumatların keçdiyinə əmin olmalısınız reduce boru kəmərində mümkün qədər erkən istifadə edərək $match и $project, və çeşidləmə yalnız sonra baş verir reduce, və axtarışın tam istədiyiniz ardıcıllıqla baş verdiyini. Lazımsız işləri aradan qaldıran, addımları optimal ardıcıllıqla sıralayan və qoşulma növlərini seçən sorğu optimallaşdırıcısına sahib olmaq sizi korlaya bilər. MongoDB ilə siz rahatlıq bahasına daha çox nəzarətə sahibsiniz.

kimi alətlər Studiya 3T -də aqreqasiya sorğularının qurulmasını sadələşdirəcək MongoDB. Aqreqasiya Redaktoru xüsusiyyəti sizə boru kəməri bəyanatlarını bir mərhələdə tətbiq etməyə və daha asan sazlama üçün hər mərhələdə giriş və çıxış məlumatlarını yoxlamağa imkan verir.

Sürətli qeyddən istifadə

Heç vaxt MongoDB yazma seçimlərini yüksək sürət, lakin aşağı etibarlılıq üçün təyin etməyin. Bu rejim "fayl et və unut" sürətli görünür, çünki əmr yazmadan əvvəl geri qaytarılır. Məlumat diskə yazılmazdan əvvəl sistem çökərsə, o, itəcək və uyğunsuz vəziyyətə düşəcək. Xoşbəxtlikdən, 64-bit MongoDB girişi aktivləşdirib.

MMAPv1 və WiredTiger saxlama mühərrikləri bunun qarşısını almaq üçün girişdən istifadə edir, baxmayaraq ki, WiredTiger son ardıcıllığa qədər bərpa edə bilər. nəzarət nöqtəsi, qeydiyyat deaktivdirsə.

Jurnallar verilənlər bazası bərpa edildikdən sonra ardıcıl vəziyyətdə olmasını təmin edir və jurnala yazılana qədər bütün məlumatları saxlayır. Qeydlərin tezliyi parametrdən istifadə edərək konfiqurasiya edilir commitIntervalMs.

Girişlərdən əmin olmaq üçün konfiqurasiya faylında girişin aktiv olduğundan əmin olun (storage.journal.enabled), və qeydlərin tezliyi itirə biləcəyiniz məlumatın miqdarına uyğundur.

İndekssiz çeşidləmə

Axtarış və ümumiləşdirmə zamanı çox vaxt məlumatları çeşidləməyə ehtiyac yaranır. Ümid edək ki, bu, çeşidlənən məlumatların miqdarını azaltmaq üçün nəticəni süzdükdən sonra son mərhələlərdən birində edilir. Və hətta bu halda, çeşidləmə üçün sizə lazım olacaq indeks. Tək və ya mürəkkəb indeksdən istifadə edə bilərsiniz.

Uyğun indeks yoxdursa, MongoDB onsuz da edəcək. Bütün sənədlərin ümumi ölçüsündə 32 MB yaddaş limiti var çeşidləmə əməliyyatları, və MongoDB bu limitə çatarsa, o zaman ya xəta atacaq, ya da geri qayıdacaq boş qeydlər dəsti.

İndeks dəstəyi olmadan axtarın

Axtarış sorğuları SQL-də JOIN əməliyyatına bənzər funksiyanı yerinə yetirir. Ən yaxşı işləmək üçün onlara xarici açar kimi istifadə olunan açarın dəyərinin indeksi lazımdır. Bu aydın deyil, çünki istifadə əks olunmur explain(). Belə indekslər yazılan indeksə əlavədir explain(), bu da öz növbəsində boru kəməri operatorları tərəfindən istifadə olunur $match и $sort, onlar boru kəmərinin başlanğıcında görüşdükdə. İndi indekslər istənilən mərhələni əhatə edə bilər aqreqasiya boru kəməri.

Çox yeniləmələrdən istifadə etməkdən imtina

üsul db.collection.update() müəyyən etdiyiniz parametrdən asılı olaraq, mövcud sənədin bir hissəsini və ya bütün sənədi tam dəyişdirməyə qədər dəyişdirmək üçün istifadə olunur. update. O qədər də aydın olmayan odur ki, siz seçimi təyin etməyincə o, kolleksiyadakı bütün sənədləri emal etməyəcək multi sorğu meyarlarına cavab verən bütün sənədləri yeniləmək.

Hash cədvəlində açarların sırasının əhəmiyyətini unutma

JSON-da obyekt sıfır ölçülü və ya daha çox ad/dəyər cütlərinin sıralanmamış kolleksiyasından ibarətdir, burada ad sətir, dəyər isə sətir, rəqəm, mantiq, null, obyekt və ya massivdir.

Təəssüf ki, BSON axtarış zamanı sifarişə çox diqqət yetirir. MongoDB-də daxili obyektlər daxilində açarların sırası məsələlərYəni { firstname: "Phil", surname: "factor" } - bu eyni deyil { { surname: "factor", firstname: "Phil" }. Yəni, tapdığınızdan əmin olmaq istəyirsinizsə, ad/dəyər cütlərinin sırasını sənədlərinizdə saxlamalısınız.

Qarışıq olmayın "Sıfır" и "müəyyən edilməmiş"

Dəyər "müəyyən edilməmiş" görə, JSON-da heç vaxt etibarlı olmayıb rəsmi standart JavaScript-də istifadə olunmasına baxmayaraq, JSON (ECMA-404 Bölmə 5). Üstəlik, BSON üçün köhnəlmişdir və çevrilmişdir $null, bu həmişə yaxşı həll yolu deyil. İstifadədən çəkinin "müəyyən edilməmiş" MongoDB-də.

Istifadə $limit() olmadan $sort()

Çox vaxt MongoDB-də inkişaf etdiyiniz zaman sorğudan və ya aqreqasiyadan qaytarılacaq nəticə nümunəsini görmək faydalıdır. Bu tapşırıq üçün sizə lazım olacaq $limit(), lakin əvvəllər istifadə etməyincə, heç vaxt son kodda olmamalıdır $sort. Bu mexanik zəruridir, çünki əks halda nəticənin ardıcıllığına zəmanət verə bilməzsiniz və məlumatlara etibarlı şəkildə baxa bilməyəcəksiniz. Nəticənin yuxarı hissəsində çeşidləmədən asılı olaraq müxtəlif girişlər əldə edəcəksiniz. Etibarlı işləmək üçün sorğular və aqreqasiyalar deterministik olmalıdır, yəni hər yerinə yetirildikdə eyni nəticələr verməlidir. ehtiva edən kod $limit(), amma yox $sort, deterministik olmayacaq və sonradan izləmək çətin olacaq səhvlərə səbəb ola bilər.

Nəticə

MongoDB-dən məyus olmağın yeganə yolu onu birbaşa DBMS kimi başqa bir verilənlər bazası növü ilə müqayisə etmək və ya müəyyən gözləntilərə əsaslanaraq ondan istifadə etməkdir. Bu, portağalı çəngəllə müqayisə etmək kimidir. Verilənlər bazası sistemləri xüsusi məqsədlərə xidmət edir. Ən yaxşısı bu fərqləri özünüz başa düşmək və qiymətləndirməkdir. MongoDB tərtibatçılarına onları DBMS yoluna məcbur edən bir yol üzərində təzyiq etmək ayıb olardı. Mən məlumatların bütövlüyünü təmin etmək və uğursuzluğa və zərərli hücumlara davamlı məlumat sistemlərinin yaradılması kimi köhnə problemlərin həllinin yeni və maraqlı yollarını görmək istəyirəm.

MongoDB-nin ACID əməliyyat qabiliyyətini 4.0 versiyasında təqdim etməsi mühüm təkmilləşdirmələrin innovativ şəkildə tətbiqinə yaxşı nümunədir. Çox sənədli və çox bəyanatlı əməliyyatlar artıq atom xarakterlidir. Kilidləri əldə etmək və ilişib qalmış əməliyyatları dayandırmaq üçün tələb olunan vaxtı tənzimləmək, həmçinin izolyasiya səviyyəsini dəyişdirmək də mümkündür.

MongoDB ilə işə başlamazdan əvvəl bilmək istədiyim 14 şey

Daha çox oxu:

Mənbə: www.habr.com

Добавить комментарий