MySQL緩存優(yōu)化方案總結(jié)
查詢緩存
想必大家應(yīng)該都知道這個相對比較雞肋的querycahce
機制,從誕生以來就不怎么受人待見,在mysql5.6將該機制默認關(guān)閉,到了mysql8直接將他取消了。
查詢緩存顧名思義是將查詢的結(jié)果集緩存住,可以簡單理解為整個sql為key,緩存sql的結(jié)果,每一次select查詢都會先檢查querycache是否有緩存,如果存在緩存的數(shù)據(jù)則直接返回,相比于磁盤讀取性能提升n倍。
聽起來十分合理,但缺點也十分明顯:
- 基于sql來緩存嚴格到字節(jié)級別,只要sql中多一個空格就不會走緩存。對于線上環(huán)境比較生硬。
- 只適用于讀多遠大于寫少的場景,一有ddl預(yù)計緩存就會失效。
- 打開查詢緩存后如果一條sql沒有命中會消耗額外的資源把結(jié)果集維護起來,浪費資源
所以一般的線上環(huán)境都不推薦使用這個機制。
表緩存
如果大家有背過mysql的八股文一定對innodb_buffer_pool_size
這個參數(shù)不陌生,既然叫innodb_buffer說明這是innodb引擎特有的參數(shù),負責(zé)緩存磁盤中的數(shù)據(jù)減少磁盤IO提升讀寫速度。
由于innodb讀取數(shù)據(jù)的基本單位是頁并且使用B+樹索引結(jié)構(gòu)來組織數(shù)據(jù),每個索引頁通常包含多個數(shù)據(jù)行,數(shù)據(jù)行按照主鍵的順序進行排序。通過主鍵索引,可以快速定位到目標數(shù)據(jù)行所在的索引頁,然后讀取對應(yīng)的磁盤頁。
每次讀取數(shù)據(jù)會連帶著整條數(shù)據(jù)頁被加載,好不容易消耗了資源讀磁盤拿出來的數(shù)據(jù)不能浪費,理所當然的存在了buffer_pool里,比如第一次查詢select * from A where id = 1
,在1附近的數(shù)據(jù)都被緩存到了buffer_pool中,下一次執(zhí)行select * from A where id = 2
時就會從緩沖池里拿。
并且buffer_pool通過change_buffer來記錄增刪改對數(shù)據(jù)的變更操作,這樣就會極大的優(yōu)化查詢速度并節(jié)省性能,緩存失效也會根據(jù)LRU的機制去淘汰舊緩存。
從這次產(chǎn)品迭代升級的新環(huán)境中發(fā)現(xiàn),部署一個新的mysql容器可以注意調(diào)整一下innodb_buffer_pool_size
對應(yīng)的值,默認為128M,通過以下命令查看。
show variables like '%innodb_buffer_pool_size%';
一般我們可以調(diào)整為機器內(nèi)存的1/4,這個可以視情況而定,修改完之后會發(fā)現(xiàn)性能提升一大截。
ReadySet
先放一下官方文檔:
上面的都是MySQL自帶的緩存方案,這個組件是最近逛github的時候碰巧看到的中間件,一個高性能且輕量的mysql&pg數(shù)據(jù)庫緩存解決方案,無需額外代碼即可將最復(fù)雜的 SQL 讀取轉(zhuǎn)變?yōu)?strong>閃電般快速的查找。本質(zhì)上基于jdbc實現(xiàn)了一套服務(wù),對上層而言就是一個數(shù)據(jù)庫,
由于我也是剛接觸不是特別了解只能簡單聊一下,它本質(zhì)上是用一個數(shù)據(jù)流圖的機制去做的,所謂數(shù)據(jù)流圖按我理解就是一個快照,基于用戶的sql構(gòu)建一個快照,后續(xù)的增刪改語句與buffer pool思路一樣,在內(nèi)存中計算。
這個方案思路上有點類似mysql中的查詢緩存和buffer_pool的整合版本,也是通過sql去緩存數(shù)據(jù),需要主動通過使用CREATE CACHE FROM
SQL擴展,將查詢緩存在ReadySet中,通過SHOW CACHES
查看所有緩存SQL,然后緩存的數(shù)據(jù)本質(zhì)上是構(gòu)造了快照,有數(shù)據(jù)更新會監(jiān)聽binlog同步到快中中并支持最終一致性保持緩存一致,當然會有一點點的數(shù)據(jù)延遲。
所以這類中間件用著用著就會帶來巨大的內(nèi)存開銷,不過在BI類似的平臺中可以試一試。
到此這篇關(guān)于MySQL緩存優(yōu)化方案總結(jié)的文章就介紹到這了,更多相關(guān)MySQL緩存優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程
這篇文章主要介紹了用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程,可以輕松地將服務(wù)器基本信息錄入數(shù)據(jù)庫,需要的朋友可以參考下2015-11-11mysql利用mysqlbinlog命令恢復(fù)誤刪除數(shù)據(jù)的實現(xiàn)
這篇文章主要介紹了mysql利用mysqlbinlog命令恢復(fù)誤刪除數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Ubuntu與windows雙系統(tǒng)下共用MySQL數(shù)據(jù)庫的方法
ubuntu系統(tǒng)和windows系統(tǒng)雙系統(tǒng)共用是用戶喜歡使用的方式之一,而MySQL是一個小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在Windows平臺中常以WAMP方式搭配使用,在Linux平臺中常以LAMP組合形式出現(xiàn),下面的方法可以使得Ubuntu平臺共用Windows平臺中的MySQL數(shù)據(jù)庫2012-01-01mysql Out of memory (Needed 16777224 bytes)的錯誤解決
至于我改的這幾個值是不是正確的解決方法,目前還不知道。先貼出來2012-07-07mysql如何獲取數(shù)據(jù)列值(int和string)最大值
最近在開發(fā)項目的時候有個需求,我數(shù)據(jù)庫里面存了很多升級包,升級包有列數(shù)據(jù)表示的是升級包的版本號,類型屬于字符串,結(jié)構(gòu)類似于V1.0.2.22這種,然后后臺有個任務(wù)需要獲取最新版本號的那條數(shù)據(jù),本文給大家介紹mysql獲取數(shù)據(jù)列值(int和string)最大值,感興趣的朋友一起看看吧2024-01-01