標籤:

mysql已經有cache了,為啥還要在它前面加一層memcached?

為什麼會有mysql+memcached這種架構?mysql的cache是白搭的么?memcached的命中憑啥比mysql自己的cache高?

忘高人求解:)


memcached是一個key/value系統,系統相對於MySQL簡單很多,雖然MySQL也有cache,但是資料庫的SQL解析會耗費性能,查詢慢於memcached,另外MySQL的cache設計得更加複雜,因為要考慮事務,日誌,存儲引擎等模塊,它的性能也沒有memcached好

memcached只做一件事情,簡單高效,在cache上比MySQL強,這應該容易理解


我覺得主要有以下幾點:

1. mysql cache無法突破單擊內存限制,MC可使用整個集群的內存

2. mysql cache只可緩存sql查詢結果,而MC可緩存進一步處理,如需要複雜計算後產生的結果

3. mysql寫多的情況下,會頻繁導致mysql cache失效,對資料庫壓力就比較大了,而且需要在內部加鎖,導致性能進一步下降,而且導致難以擴展為集群;而如果對數據一致性要求沒那麼高,可以在寫完db後再將MC cache失效,可以有效減少db壓力

在建好索引,足夠優化的情況下,mysql cache作用不大把。就不如把db的內存用來存索引了。

當然,有使用MC作為mysql cache的辦法。但是配置複雜,使用較少,不如將MC作為mysql前面的代理使用更方便、更易於擴展。


1.獲得數據 2.處理數據 3.緩存數據 4.讀取緩存數據

  • Mysql Query Cache沒有介面放定製數據(2,3),只能放搜索結果集,只是對1的優化,在具體業務場景里沒有可用性;
  • Memcache里可以放任意結構的業務數據;因此程序員可以通過合理地設計,提升cache的使用效率。


memcached是kv存儲,mysql是傳統關係型存儲,不一樣。Mysql相當於航母,memcached相當於艦載機。


memcached緩存一般都是經常使用的,容易緩存的數據,如members表。而一些列表搜索不好緩存,如products搜索結果,這個讓mysql來緩存效果更好。memcached把members常用操作緩存了,會更加有利於其他sql緩存,否則mysql緩存的可能大部分都是members表。

另外memcached可以添加額外數據,不僅僅是表裡面的數據,這部分數據業務需要,但是無需存儲,僅僅是用戶登陸的時候需要保存下。

當然memcached另外還用來緩存其他數據,如js,css,圖片等


主要是用memcached分擔一些低可靠性索引命中率高的請求,讓mysql儘可能保持低負載高效率去處理核心關係數據。


越是頂層的緩存,效果越明顯


一個是記錄緩存,比較有針對性,一個是頁緩存,容易錯殺


都別扯! 內存的讀寫速度和硬碟的讀寫速度分別是多少?


一個是MySQL自己根據SQL自己瞎猜的緩存結構,一個是程序員自己設計的。


我覺得主要考慮的是 橫向擴展的便捷性差別。。


mysql的query cache基本上是白搭的。


兩個cache的是不能對比的:

mysql的連接數是非常寶貴的資源,如果把cache和未命中的數據請求分開,能很大程度上提高mysql的並發;

mysql設計的是支持結構化數據,光這一點考慮的細節問題消耗就要比keyvalue的複雜很多;

mysql的內存利用是有問題的,他需要把大部分內存空間用作filter、sort、group等數據處理,如果內存不足,內存利用效率更差,需要經常過期,同時涉及到臟數據,內存里的數據要定期被checkpoint寫入磁碟;

其實這個問題好比為何有nigixapache一樣無聊....


推薦閱讀:

R markdown 連接mysql數據
一觸即發,2017年,資料庫世界的諸神之戰
mysql注入篇
phxsql如何編譯?

TAG:MySQL | Memcached |