簡體   English   中英

MongoDB,復雜查詢和性能

[英]MongoDB, Complex Queries, and Performance

背景故事

在當前項目中,我將MySQL和SQLite相互結合使用。 我目前正在為每個用戶提供他們自己的SQLite數據庫來繞過我的提供商的1GB MySQL數據庫限制。 它運行良好,性能良好,但我知道這些平面文件數據庫的持續維護將成為未來的噩夢。

SQLite非常強大,並且支持一些非常復雜的SQL查詢。 但是,我正在尋找MongoDB,為我的用戶的批量數據添加一些NoSQL。 每個用戶可以生成60,000行或更多行。 隨着用戶數量的不斷增加,我將來會擔心性能問題。

-

復雜

我對MongoDB和其他NoSQL數據庫的擔心是,它們在支持哪種查詢操作時似乎更受限制。 如果你只是需要直接,簡單的批量查詢,這沒什么大不了的,但是我必須做一些更復雜的連接和過濾(聯合,區分大小寫,分組,偶爾加入等等)。

我的示例查詢嘗試按藝術家選擇曲目列表。 主要問題是這些藝術家的名字可能不匹配 例如,有些人標記為“A Day to Remember”,有些人標記為“A Day To Remember”。 使用區分大小寫的查詢,這會導致多個“不同”的記錄但實際上是相同的記錄。 通常我修剪和LOWER()字段以正確地將它們組合在一起。

-

性能

我在本地計算機上創建了兩個全新的數據庫。 一個用於MongoDB,一個用於MySQL。 我正在和他們用PHP交談,因為這是我的最終結果必須使用的。 每個數據庫中只有大約9,000條記錄,所以此時它並不是非常大。

我在我的機器上運行了一些測試,並為MongoDB提供了令人失望的結果。 讓我們考慮這三個問題......

#1 - MongoDB:~14ms,結果不正確

$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,結果正確

$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,結果正確

$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";
}

-

討論

也許我只是沒有正確地查詢#2,但只是看看Javascript查詢引擎如何殺死它 這里總共沒有很多記錄可供處理:所有數據庫中的記錄都不到9,000。

我的主要問題是 :最終什么會更可靠,更高效,仍然適合我的需求? 隨着我的項目用戶群的增長,我希望離開我的有限服務器並獲得一些專用的東西。 使用我自己的MySQL安裝,我應該能夠維護自己的大型MyISAM表,只需很少的關系數據和正確的索引。

但是數據庫中有數百萬條記錄,MySQL的性能會怎樣? 鼓勵對此進行思考,評論和一般性討論。 謝謝!

嘗試使用正則表達式:

$regex = new MongoRegex('/^' . preg_quote('a day to remember'). '$/i');
$query = array('artist' => $regex);
$cursor = $collection->find($query);

如果要在Mongodb中對此值進行不區分大小寫的搜索,則必須存儲兩次值。 一旦正常,一次用小寫進行索引和搜索。

Mongodb具有豐富的查詢語言(與其他nosql系統相比),您可以索引列的每個(組合)。 但是我確實發現mapreduce很慢,但是只要你沒有mapreduce就可以解決你的問題,你很好。

不同的NoSQL解決方案之間的區別遠遠超過傳統的SQL數據庫,但MongoDB實際上是功能最豐富的解決方案之一,尤其是在查詢復雜性方面。

但是,您不應該盲目地選擇NoSQL解決方案,因為您希望每個用戶有60,000行。 MySQL和其他流行的關系DBMS可以毫無問題地處理數十億行。

關系數據庫具有許多重要功能(例如ACID保證和復雜查詢),如果您需要這些功能,您也可以使用SQL數據庫。 NoSQL通常是其中一些功能(或所有功能)之間的權衡,以及水平可擴展性的簡易性。 如果您可以期望使用關系DBMS管理系統的可伸縮性問題,那么我會認真考慮堅持使用SQL。

我目前正在為每個用戶提供他們自己的SQLite數據庫來繞過我的提供商的1GB MySQL數據庫限制。

您也可以考慮切換提供商。 應用此類限制的主機最終可能會以其他方式限制您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM