Mongodb vs Mysql

Bugün benimde merak ettiğim ve araştırdığım bir konu hakkında yazı yazacağım . Birçok geliştirici bu konuyu tartışıyor . Ben NodeJS dili için bu karşılaştırmayı yapmak istiyorum . NodeJS geliştiricilerin bazıları MongoDB , NodeJS için en uygun veritabanı der . Bazıları da ilişkisel veritabanları(Mysql,PostgreSQL) kullanın derler .

Test ortamı

MongoDB ve Mysql karşılaştırması için : 4GB ram'li ,2.5 GHz Intel Core i5 işlemcili bir sanal makine kurdum .

Sorgular için  nodejs frameworkü olan Hapi.js üzerine inşa edilmiş mongodb sorgu api'si kullandım .  Ve herhangi bir cache sistemi kullanmadım .

Test üç farklı model üzerinde gerçekleştirildi.

1 - Mongo-flat -  Sadece "Users" koleksiyonu olan düz bir şema  . Ve adresler bu koleksiyona direk gömülü . Yani şu şekilde :

2 - Mongo-relation - Buda mongodb ilişkisel şema örneği . "Users" ve "Address" adında 2 farklı şema var . Ve bunlar ilişkisel olarak birbirine bağlı . Yani şu şekilde :

3 - Mysql - Bu da ilişkisel mysql tablo örneği . "Users" ve "Address" adında 2 tablo var ve ilişkisel olarak birbirine bağlanmış . Şu şekilde :

Testlere başlıyoruz

1 - Insert - Kayıt ekleme 2 şekilde yapıldı . Veriler tek tek ve topluca(bulk) eklendi . 

Not : Yaklaşık 5000 kayıt var .

Testi kazanan mongo-flat-bulk(Mongo tek şemalı toplu) oldu . MongoDB insert işlemlerinde Mysql'i açık ara farkla geçiyor . çünkü MongoDB büyük veri saklamak için geliştirilmiş bir veritabanıdır . Insert işlemleri son derece hızlıdır .

2 - Kullanıcıya adres ekleyelim 

Testi kazanan mysql oldu . çünkü ilişkisel sorgu işlemlerinde Mysql çok hızlıdır . Bunun için tasarlanmıştır .

3 - Kayıt silme

Testi mongo-flat kazandı . çünkü mongodb veri ekleme ve silme işlemleri için tasarlanmış bir veritabanıdır . Bu işlemleri oldukça hızlı yapar . İlişkisel sorgularda dezavantajlıdır .

Ayrıca mysql ilişkisel sorgulardaki ayrı ayrı tablolardaki kayıtları silmeniz için sizi uğraştırmaz . Verileri birbirine "foregn key" ile bağlarsanız , örneğin kullanıcı tablonuzdaki kayıtları sildiğinizde,mysql "Adress" tablosundaki bu silinen kullanıcıya bağlı bütün adres kayıtlarını sizin için siler . MongoDB de her tablodaki kayıtı silmek zorundasınız .

4 - Tek seferde 5000 kullanıcıyı getirme

Testi mysql kazandı . Veritabanından veri alma işlemlerinde mysql daha hızlıdır .

5 - Veritabanında kaç tane kullanıcı olduğunu saydıralım(count)

Testi kazanan mongodb oldu . Mysql sayma konusunda oldukça kötü .

6 - 5000 kullanıcıyı adresleri ile birlikte çekelim

mongo-flat ve mysql yaklaşık aynı sonuç verdi . Fakat mongo-relation aşırı kötü bir performans verdi . Daha öncede dediğim gibi, mongodb ilişkisel sorgularda çok kötü sonuçlar veriyor .

7 - Florida'da yaşamayan kullanıcıları listeleyelim

Kazanan mysql ve mongo-flat oldu . mongo-relation ikişkisel sorgularda yine kaybetti . mongo-relation sorgusu için önce kullanıcıları alırsınız,sonra bu kullanıcılara ait adresleri alırsınız .

Sonuç

Bütün test sonuçlarına bakarsak MongoDB "insert" işlemlerinde çok hızlı . Bunun sebebi mongodb çok fazla veri tutabilmesi için tasarlanmış bir veritabanı olması . Bunun için veri kaydetme işlemleri çok olan projelerde mongoDB kullanabilirsiniz . Örneğin ziyaretçi logları, chat siteleri için mongoDB çok iyidir .

Mysql'in veri alımı ve raporlama için çok iyi olduğunu görüyorum . Sürekli veri eklemeyeceksiniz , ve verilerinizi çok iyi raporlamak istiyorsanız Mysql çok iyi bir tercih . Örneğin e-ticaret sitelerinde yeni ürün çok nadir eklenir . Fakat sürekli bir arama,raporlama işlemi vardır .

MongoDB'yi ilişkisel olarak kullanabiliyoruz .  Fakat bu çok kötü sonuçlar veriyor . çünkü mongodb ilişkisel bir veritabanı olarak tasarlanmadı . Kullanıcılar ve adreslerini çekmek için 2 farklı sorgu kullanmanız gerekiyor . Önce kullanıcılar şemasından kullanıcıları çekip,sonra bu kullanıcıların adresleri çeken 2. bir sorgu yazmanız gerekiyor . Ve özellikle Node.js gibi "single-threaded" diller kullanıyorsanız performans olarak aşırı kötü sonuçlar elde edersiniz .

Mysql kullandığımda yavaş olabilir mi ? Evet bazı durumlarda yavaşlar . Fakat bu yavaşlamanın en büyük sebebi tabloları düzgün tasarlayamamış ve birbirine bağlayamamışsınızdır . Mysql gibi ilişkisel veritabanlarında ki en büyük sıkıntı,tabloları düzgün tasarlamanın zorluğudur .

Hem mongoDB hemde MySQL mükemmel teknolojilerdir . İkisininde hizmet ettiği alanlar farklıdır . Mysql'den MongoDB'ye geçelim,veya MongoDB 'den Mysql'e geçelim gibi bir yanlışa düşmeyin .

MongoDB yi kesinlikle ilişkisel verilerde kullanmayın derim .