mysql的MEMORY引擎為什麼應用沒有redis的應用廣泛?
我看很多人寧願用redis存儲數據的json也不會用mysql的MEMORY引擎,請問是這個引擎性能差還是什麼原因嗎?我觀察過國內一些開源項目也基本上沒有用到過這個引擎,這是為什麼吶?
MySQL的內存表(memory引擎)還是有項目用的.
據我所見,論壇PunBB(FluxBB)里的online表,Discuz!里的pre_common_session等一些表都使用了MySQL內存表.
MySQL內存表默認使用的是hash索引(跟Redis/Memcached一樣),區別於InnoDB表默認的B+樹索引.hash索引最大的優勢就是,等值查詢和更新速度都很快,但範圍查詢和排序就不給力了.這很好理解,因為hash索引下的數據是無序的,而B+樹索引下的數據是有序,存儲在B+樹葉子節點裡的數據會被連起來組成一條有序鏈表.
當然用MySQL內存表實現K/V存儲也是可以,設置3個欄位,分別為鍵/值/時間,比如:CREATE TABLE IF NOT EXISTS `memory` (
`key` varchar(40) NOT NULL,
`value` text NOT NULL,
`date` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`key`) USING HASH
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO `memory` (`key`, `value`, `date`)
VALUES (key1, value1, 20160906173140);
INSERT INTO `memory` (`key`, `value`, `date`)
VALUES (key2, value2, 20160906173140);
其實memory內存表也是可以使用text相關類型的欄位的.
Percona Server 5.6上實測.還是性能不夠高吧,我記得以前同事的測試結果是Innodb的33倍讀寫。比Redis還是差好多的。其實就算高三十幾倍,還是有用武之地。現在確實是值得挖掘一下。替代Redis不現實,Redis我七八年前的測試數據,軟體秒響應極限就在一萬這個級別(同時代的 Nginx 在沒有魔改的情況下,大約三萬)。
從kv緩存的作用看,mysql優點不在kv緩存上,用它做kv緩存維護成本高,redis安裝啟動使用簡單,mysql效率功能也沒redis強大,
redis專門針對一些場景做了優化,例如計數器,可以精確計數,精度要求不高也可以模糊計數,佔用內存更少;集合間的各種操作更簡單高效,典型應用場景社交應用下好友,粉絲各種操作;瀉藥
偶基本沒咋用過mysql
要用一般就是 MyISAM (存點日誌啥的)和 InnoDB (正經業務數據)
MEMORY 的問題是得用定長欄位變長的不能用(比如 text 這種)然後導致設計表時候的餘量就小了你懂的,產品來回 改改改
不確定的存個json字元串以後隨便加減都方便 text啥的用不了,沒準動不動就得改表結構這多 受不了啊……不懂,不會,怕出問題。
MEMORY引擎和redis最大區別是什麼? 這個才是重點把。
感覺占內存有點狠?曾經我和 @楊政 做一個數據分析的後端,為了速度快,把 2GB 的 SqlLite 里的數據 插到 MySQL MEMORY 引擎里,好像佔了大概 8G 內存。
我自己寫的論壇中的online 表就是用memory 引擎的。
作為kv 查詢是夠用了,但有一個很嚴重的limit,就是表總容量很小。不像redis 和memcache 那樣可以一直添加。同一時間我也有redis 去處理更加煩心的緩存問題。redis編譯好了之後,只需要一個執行程序和一個配置文件就可以運行,調用的API相對來說也簡單。同樣的功能要去折騰MySQL幹嘛。MySQL上來你要安裝,如果沒有外網手動安裝你還要折騰編譯安裝,然後建資料庫建表結構,打開你機器對MySQL的訪問許可權,然後是複雜的操作API,你還得注意連接超時的配置,新手去用的時候覺得特別傻逼
大家有沒有用過ndb的引擎
Redis除了資料庫,還有其他用途。
推薦閱讀:
※aredis —— 一款高效的非同步 redis 客戶端
※scrapy-redis 和 scrapy 有什麼區別?
※Linux安裝redis,並設置訪問許可權,及使用可視化工具
※求指教學習redis源碼的方法?