MongoDB, Karmaşık sorgular ve Performans

0 Cevap php

Back-Story

Geçerli projede, ben birbirleri ile birlikte MySQL ve SQLite kullanıyorum. Şu anda benim sağlayıcının 1GB MySQL DB sınırı aşmanın her kullanıcıya kendi SQLite veritabanı veriyorum. Sorun dışarı çalıştı ve performansı iyi, ama bu düz dosya veritabanları sürekli bakım gelecekte bir kabus olacak bir gerçeği bilecek.

SQLite şaşırtıcı derecede güçlü, ve bazı oldukça karmaşık SQL sorguları destekler. Ancak, benim kullanıcının toplu veri için küçük bir NoSQL ile gemide hop MongoDB bakıyorum. Each user could 60.000 satır veya daha fazla üretir. Kullanıcıların sürekli artan sayısı ile , gelecekte performansı hakkında endişe olsun.

-

Complexity

MongoDB ve diğer NoSQL veritabanları ile benim endişe onlar destek sorgu işlemlerinin ne tür daha sınırlı görünüyor olmasıdır. Bu (.. sendikalar, harf duyarlılığı, gruplaşmalar, zaman zaman katılmak, vb) sadece basit, basit bir toplu sorguları gerekiyorsa, ancak ben biraz daha karmaşık katılmadan ve filtreleme yapmak lazım hiçbir büyük anlaşma.

Benim örnek sorgu sanatçının parçalarından bir liste seçmek için çalışıyor. Asıl sorun, bu sanatçı isimleri may not match olduğunu. Örneğin bazı insanlar "Remember A Day" olarak etiket ve bazı insanlar tag "A Day To hatırla" gibi. Bir harfe duyarlı sorgu ile, bu "farklı" ama geri gelmek için gerçekten aynı şey birden fazla kayıt olur. Genellikle ben Döşeme ve ALT () birlikte alanlar düzgün grup onları.

-

Performance

Ben benim yerel makinede iki taze, yeni veritabanları yarattı. MongoDB için bir, ve MySQL için. Bu benim sonuçta kullanmak zorunda olacak ne yana ben PHP ile onlarla konuşuyorum. Her veritabanı sadece bu yaklaşık 9.000 kayıtları vardır, bu yüzden bu noktada korkunç büyük değil.

Benim makinede birkaç testleri koştu ve MongoDB için hayal kırıklığı yaratan sonuçlar geldi. Bu üç sorguları düşünelim ...

#1 - MongoDB: ~14ms, incorrect results

$query = array('artist' => 'A Day to Remember');
$cursor = $collection->find($query);
foreach ($cursor as $row) {
    echo $row['artist'] . ' - ' . $row['album'] . ' - #'. $row['track'] . ' ' . $row['title'] . "\r\n";
}

#2 - MongoDB: ~170ms, correct results

$query = array('$where' => "this.artist.toLowerCase() == 'a day to remember'");
$cursor = $collection->find($query);
foreach ($cursor as $row) {
    echo $row['artist'] . ' - ' . $row['album'] . ' - #'. $row['track'] . ' ' . $row['title'] . "\r\n";
}

#3 - MySQL: ~18ms, correct results

$sql = "select artist, album, track, title from radio_files where lower(artist) = 'a day to remember'";
$stmt = $mysqldb->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    echo $row['artist'] . ' - ' . $row['album'] . ' - #'. $row['track'] . ' ' . $row['title'] . "\r\n";
}

-

Discussion

Belki sadece # 2 için doğru sorgulama, ama just look at how the Javascript query engine kills it değilim. Burada toplam uğraşmak için bile pek çok kayıt yok: Bu veritabanının tüm hemen altında 9.000.

My main question is this: ne sonunda daha güvenilir ve başarılı olacak ve hala benim ihtiyaçlarına uygun olduğunu? Benim projenin userbase büyüdükçe, benim sınırlı sunucu bırakmak ve zaten özel bir şey almak için arıyorum. Kendi MySQL kurulumu ile ben biraz ilişkisel veri ve doğru endeksleme ile benim kendi büyük MyISAM tabloları korumak gerekir.

Ancak veritabanındaki kayıtları milyonlarca, ne MySQL performans olur? Düşünceler, yorumlar, ve bu konuda genel tartışma teşvik edilir. Teşekkürler!

0 Cevap