非死book MySQL工程師吐槽MemSQL:MySQL比你們快無數倍

jopen 12年前發布 | 12K 次閱讀 MemSQL

導讀:前 非死book 前工程師 Eric Frenkiel 和 Nikita Shamgunov 創辦了 MemSQL,對外宣稱比 MySQL 快 30 倍。現在 非死book 的 MySQL 工程師 Domas Mituzas 出來說話了,以下是其在個人博客的博文:

我不喜歡這個愚蠢的基準,這完全是在浪費我的時間。同樣,我也不喜歡所謂的市場營銷。當然了,有時我還是會關注一下這些東西,現在我就占用你們點些時間來談談。

所謂的 MemSQL,是由一群聰明的小伙兒鼓搗出來的,他們現在正在媒體和技術社區“興風作浪”。他們的核心論斷即:“MemSQL 比傳統基于磁盤的數據庫快 30 倍。”

雖然他們這樣說沒什么意義,但我想知道他們到底哪里做錯了。MySQL 和 MemSQL 都在默認設置下運行。他們說這是一個好的基準,通過安裝標準包來比較用戶體驗。

這已經是在說瞎話了,系統必須在完全不同的配置文件中運行。例如,用于數據緩沖的內存在 MemSQL 中本質上是解除綁定的,而 InnoDB 在 MySQL5.5 把它限制在了 128MB,這是 MySQL5.1 默認設置的 16 倍。

至于寫入性能方面,MemSQL 能寫出 2G 的快照日志,而 InnoDB 設置為 10MB 的事務日志,所以會更快地開始檢查點。盡管如此,對于基準來說,穩定持久是最重要的。

MemSQL 宣稱支持 ACID,其中耐久性是最重要的一環。MySQL 的 InnoDB 默認是很耐用的,如果事務返回為“同意”,就會在崩潰后刻到磁盤上。MemSQL 默認也是很“耐久”的,它也會有一個事務日志,而這并不意味著跟磁盤有關。

MemSQL 也有事務緩沖設置,默認“完全耐久性模式”會不同時地返回“同意”直到 128M 緩沖區充滿。本質上這跟 innodb_flush_log_at_trx_commit=2很相似,在我看來不會很持久。

如果 MemSQL 激活了完全的耐久性會發生什么呢?結局肯定是悲劇。每次提交都得等后臺線程才能寫事務日志。多久后臺線程才能醒一次?50毫秒一次。MemSQL 其實是玩的是計時戲法,每 50 毫秒沖一次,然后說后臺線程一直沒醒。

吐槽點一:MemSQL 每秒持久事務比 InnoDB 慢 500 倍

這一點很容易證明:在磁盤陣列控制器的后寫式緩存模式下,InnoDB 能夠輕易的維持單線程每秒 10K 的事務,在 fsyncs 空隙不會停 50 毫秒。有一些提交分組,兩個線程有 40tps,十個線程有 200tps,但當我選擇自己的基準時,MemSQL 單線程持久事務率會變得更慢。

既然我們已經確立了 MySQL 的領先優勢,讓我們一起來看讀寫的表現。我敢肯定這方面 MemSQL 的表現會大亮。MemSQL 掃描表的執行速度還是不錯的,每秒掃描 8M 行,這對單線程來說是很了不起的成就。

說實話,我不想花時間用基準問題測試內存數據庫所擅長的。我決定測試我最愛的查詢:

SELECT * FROM table ORDER BY id DESC LIMIT 5 

網上到處是這個查詢,MySQL 通過指向索引位置的游標,然后按照指標順序逐步游動。而 MemSQL 實際上必須穿越整個目錄,分類提供響應。即使是“SELECT MAX (id)”也需要穿越整個目錄。

吐槽點二:MemSQL 在做一些簡單的讀寫查詢時,比 MySQL 慢上千倍,也許是慢百萬倍

我們假設 MemSQL 在一些普通運算有O(N) performance,因此我們只需找到那個足夠大的N。我不知道我們應該如何責備 MemSQL 的研發人員和被他們誤導的那些記者朋友。如果我們回到 ACID,A代表原子性,只在語句級實現,BEGIN/COMMIT 被無視了。隔離性是提交讀。持久性是有缺陷的,我不關心字母C所代表的。我必須承認,MemSQL 常見問題中說,MemSQL 支持完整 ACID 事務,當然了,說是這么說。

MemSQL 每秒 80000 次查詢沒什么值得炫耀的,因為現在 MySQL 有了 HandlerSocket,計算能力接近每秒百萬次。當然了,他們也有自己擅長的事情,目前是最快的 MySQL 協議,當然也沒超出 MySQL Cluster 多少。NDB 也有很不錯的表現。我確信,我上面的兩則聲明會被一些技術工作所完善。寫入性能需要適當的實時與分組提交同步(雖然二進制日志所涉及的工作很復雜,MySQL 最近還是推出了幾項重大更新)。

讀取性能需要實現最常見模式的最優化,例如按索引順序讀取。內存是快,但還沒快到高并發環境所需要的一遍又一遍的重復讀取。即使在 MemSQL 表現良好的部分,我也懷疑 MemSQL 的內存工作負載能否超過 InnoDB30 倍。今天我就不做基準測試了,但我還是能很輕易的證明這一點。

無論如何,如果我們清楚 MemSQL 的一系列動作或是有一個不錯的標桿管理的話,也就不需要我這篇稿子了。接下來我們就開始測試吧,然后得出屬于自己的結論。

文章來源:dom.as

來自: CSDN

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!