為什麼NoSQL比較快?
今天參加某conference,講者說雲端提供的NoSQL比傳統B-tree database快,因為B-tree database使用SQL介面,需要額外轉譯執行,而NoSQL只要使用簡單的API calls (get, put, scan),少了SQL這一層。聽起來似乎有點道理,就以此為開頭,講一些我的想法吧。
NoSQL也是可以有SQL介面的,Apache Phoenix / Casandra CQL / MongoDB query language是一些例子,不過SQL提供的強大功能如aggregate / join在NoSQL上因為data partitioning的關係所以不完全支持,即便支持也因為效能問題需要謹慎使用,所以SQL+optimizer帶來的優勢不是很大(在OLAP系統中反而非常吃重),比較多的還是提升易用性。但SQL+optimizer是運行在CPU+Memory+小量metadata的環境高速迭代,針對database這種read/write against disk的場景來說,SQL對性能能起多大決定性作用,我是打問號的。
Get Evans Ye’s stories in your inbox
Join Medium for free to get updates from this writer.
換個角度來看,NoSQL通常以high write throughput為主打,因為寫時主要是append write ahead log和mem table就完成了,但相對讀時要做的事情就比較多了,需要讀取mem table和掃on disk的SS tables來整理出需要的rows和versions。比起維護單一version的B-tree database來說,NoSQL不見得比較快。另外NoSQL在flush mem store和運行compaction時帶來的性能影響也不若B-tree database這麼省心。
不過講者說的另一段話是沒錯,那就是B-tree database因為是二元樹形式,因此只能在一定的量級內提供能良好效能,而NoSQL有比較好的scalibility。
NoSQL不論是Range或是Hash Partitioning的實作,都能利用key和partitions的mapping關係,排除大量無效的搜索空間,而且這個操作幾乎與資料量N無關;B-tree要locate到row則需要LogN的時間,比較容易受資料量影響效能。
總的來說,我不會說NoSQL就比較快,它們有各自的強項such as NoSQL has better scalability; B-tree database has better support over ACID. 縱然有如Spanner這類NoSQL(or NewSQL)利用原子鐘等特殊硬體打破網路不確定性的限制做到distributed transactions,在NoSQL上達成ACID需要更高的成本(特殊硬體、等待延遲、運算量)是不變的。





