2014-03-03 47 views
0

爲什麼NoSQL認爲結構上比某些SQL db更快?假設我在某個SQL表的列上添加了一些索引。有人可以提供某種更快的查詢嗎?NoSQL的優勢

我在讀關於redis的內容。

class User < ActiveRecord::Base 
    def follow!(user) 
    $redis.multi do 
     $redis.sadd(self.redis_key(:following), user.id) 
     $redis.sadd(user.redis_key(:followers), self.id) 
    end 
    end 
.... 

儘管redis的RAM存儲,這個代碼如何在結構上比設置一些followship表更快?核心符號表的實現建立在數組上,這可以被認爲是SQL表id。

至於RAM的redis內存存儲,它怎麼會持續下去?

+0

沒有NoSQL這樣的東西。只有很多新的數據庫技術彼此之間沒有多大關係。雖然他們中的一些人可以比SQL數據庫更快地完成一些任務,但還有一些其他的東西,其中一些更慢或者根本無法完成。 – Philipp

回答

4

某些* NoSQL數據庫在某些*操作中比某些* SQL數據庫更快的原因是,因爲它們中的某些*的工作更簡單。多年來,一些*關係數據庫管理系統積累了許多功能蠕變。大多數*關係數據庫不僅僅是數據表。它們具有自動優化索引,事務,外鍵關係,約束,觸發器,存儲過程,強制一致性,智能視圖,奇異數據類型,深奧查詢命令等等。

作爲比較:Redis目前約有20,000行代碼。另一方面,MySQL現在已經超過150萬個LoC!不要誤解我的意思,所有*這些功能都有其存在的理由。但他們都不是免費的。它們都需要權衡,使其他操作變得更慢。

大多數*另一方面,NoSQL數據庫是較新的開發方式,它將所有複雜性全部拋在腦後,只專注於最重要的事情:通過索引快速檢索信息。這種簡單性使得一些* NoSQL數據庫一開始就顯得更快更高效。但請記住,這些價格是有代價的:當您真正需要由許多*關係數據庫提供的這些功能時,通常必須通過非常複雜的查詢或通過進行多個查詢並在應用程序級別執行其他操作來複制它們。這可能會使一些* NoSQL數據庫對於某些*用例甚至更慢。底線:NoSQL數據庫只是您工具箱的更多工具。也許你有一些問題比他們的舊工具更好解決。但其他問題可能更適合您的舊工具。

關於RAM存儲和持久性在一個數據庫中的共存:這些*數據庫通常在RAM中執行寫入操作,報告成功(或失敗)並稍後保留這些更改。讀操作首先從RAM提供,並且只有當信息沒有在那裏找到時,它們纔在硬盤上查找。這可以提高最近訪問數據的寫入響應速度和查找速度,但是如果發生突然崩潰,可能會丟失最近的數據。

*)不是全部,也有例外

+0

最着名的Nosql數據庫例如mongodb,nosdb(我已經使用過它們)都有Journal。用戶操作會立即插入到日誌中,以便在數據庫崩潰時重新應用操作。使用日記幾乎可以使數據丟失無效。關於查詢,NoSql的分佈式特性使得查詢處理更快,因爲首先查詢結果是在每個節點上可用的少量數據上計算出來的,然後結果在查詢路由器中合併。顯然,每個節點的數據量較小,因此可以更快地計算結果。根據時間複雜性來思考。 –