MySQL查詢緩存優(yōu)化示例詳析
一、概述
在日常使用數(shù)據(jù)庫(kù)中,80%的數(shù)據(jù)請(qǐng)求都是查詢,而余下的20%是更新或者增加數(shù)據(jù)。如何提升查詢性能,便是提高數(shù)據(jù)庫(kù)處理能力的關(guān)鍵。
二、查詢優(yōu)化內(nèi)容
1、查詢緩存的原理
查詢的路線圖:
緩存SELECT操作或預(yù)處理查詢的結(jié)果集和SQL語(yǔ)句,當(dāng)有新的SELECT語(yǔ)句或預(yù)處理查詢語(yǔ)句請(qǐng)求,先去查詢緩存,判斷是否存在可用的記錄集,判斷標(biāo)準(zhǔn):與緩存的SQL語(yǔ)句,是否完全一樣,區(qū)分大小寫(xiě)。
2、查詢緩存的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
不需要對(duì)SQL語(yǔ)句做任何解析和執(zhí)行,當(dāng)然語(yǔ)法解析必須通過(guò)在先,直接從Query Cache中獲得查詢結(jié)果,提高查詢性能
缺點(diǎn)
查詢緩存的判斷規(guī)則,不夠智能,也即提高了查詢緩存的使用門(mén)檻,降低效率查詢緩存的使用,會(huì)增加檢查和清理Query Cache中記錄集的開(kāi)銷(xiāo)
3、不能應(yīng)用查詢緩存的內(nèi)容
- 查詢語(yǔ)句中加了SQL_NO_CACHE參數(shù)
- 查詢語(yǔ)句中含有獲得值的函數(shù),包含:自定義函數(shù),如:NOW() ,CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ()等
- 對(duì)系統(tǒng)數(shù)據(jù)庫(kù)的查詢:mysql、information_schema 查詢語(yǔ)句中使用SESSION級(jí)別變量或存儲(chǔ)過(guò)程中的局部變量
- 查詢語(yǔ)句中使用了LOCK IN SHARE MODE、FOR UPDATE的語(yǔ)句,查詢語(yǔ)句中類(lèi)似SELECT …INTO 導(dǎo)出數(shù)據(jù)的語(yǔ)句
- 對(duì)臨時(shí)表的查詢操作
- 存在警告信息的查詢語(yǔ)句
- 不涉及任何表或視圖的查詢語(yǔ)句
- 某用戶只有列級(jí)別權(quán)限的查詢語(yǔ)句
- 事務(wù)隔離級(jí)別為Serializable時(shí),所有查詢語(yǔ)句都不能緩存
4、查詢緩存相關(guān)的服務(wù)器變量
- query_cache_min_res_unit:查詢緩存中內(nèi)存塊的最小分配單位,默認(rèn)4k,較小值會(huì)減少浪費(fèi),但會(huì)導(dǎo)致更頻繁的內(nèi)存分配操作,較大值會(huì)帶來(lái)浪費(fèi),會(huì)導(dǎo)致碎片過(guò)多,內(nèi)存不足
- query_cache_limit:?jiǎn)蝹€(gè)查詢結(jié)果能緩存的最大值,單位字節(jié),默認(rèn)為1M,對(duì)于查詢結(jié)果過(guò)大而無(wú)法緩存的語(yǔ)句,建議使用SQL_NO_CACHE
- query_cache_size:查詢緩存總共可用的內(nèi)存空間;單位字節(jié),必須是1024的整數(shù)倍,最小值40KB,低于此值有警報(bào)
- query_cache_wlock_invalidate:如果某表被其它的會(huì)話鎖定,是否仍然可以從查詢緩存中返回結(jié)果,默認(rèn)值為OFF,表示可以在表被其它會(huì)話鎖定的場(chǎng)景中繼續(xù)從緩存返回?cái)?shù)據(jù);ON則表示不允許
- query_cache_type:是否開(kāi)啟緩存功能,取值為ON, OFF, DEMAND
5、SELECT語(yǔ)句的緩存控制
- SQL_CACHE:顯式指定存儲(chǔ)查詢結(jié)果于緩存之中
- SQL_NO_CACHE:顯式查詢結(jié)果不予緩存
- query_cache_type參數(shù)變量
- query_cache_type的值為OFF或0時(shí),查詢緩存功能關(guān)閉
- query_cache_type的值為ON或1時(shí),查詢緩存功能打開(kāi),SELECT的結(jié)果符合緩存條件即會(huì)緩存,否則,不予緩存,顯式指定SQL_NO_CACHE,不予緩存,此為默認(rèn)值
- query_cache_type的值為DEMAND或2時(shí),查詢緩存功能按需進(jìn)行,顯式指定SQL_CACHE的SELECT語(yǔ)句才會(huì)緩存;其它均不予緩存
6、查詢緩存相關(guān)的狀態(tài)變量
show gloable status like 'Qcache%' ;
7、查詢的優(yōu)化的檢查路線
8、命中率和內(nèi)存使用率估算
查詢緩存中內(nèi)存塊的最小分配單位query_cache_min_res_unit :
(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
查詢緩存命中率 :
Qcache_hits / ( Qcache_hits + Qcache_inserts ) * 100%
查詢緩存內(nèi)存使用率:
(query_cache_size – qcache_free_memory) / query_cache_size * 100%
9、版本差異
在早期版本mysql均支持緩存,但是隨著redis等內(nèi)存型高性能的緩存技術(shù)興起,mysql已經(jīng)拋棄自己的緩存功能,mysql8.0以后不再支持緩存功能。
三、總結(jié)
MYSQL的緩存優(yōu)化在早期版本可以起到一定的優(yōu)化作用,最新的版本不再支持,緩存的功能而由其他的緩存服務(wù)來(lái)承擔(dān)。
到此這篇關(guān)于MySQL查詢緩存優(yōu)化的文章就介紹到這了,更多相關(guān)MySQL查詢緩存優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情
這篇文章主要介紹了Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情,Mysql常用的存儲(chǔ)引擎如InnoDB、MyISAM采用的是文件存儲(chǔ),自然和文件系統(tǒng)掛鉤,那么Mysql都有哪些地方用到了文件系統(tǒng)呢,下面我們一起進(jìn)入文章學(xué)習(xí)詳細(xì)內(nèi)容吧2022-09-09MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議
這篇文章主要介紹了MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議,幫助大家更好的處理MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-08-08SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南
這篇文章主要為大家介紹了SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11mysql函數(shù)IFNULL使用的及注意事項(xiàng)說(shuō)明
這篇文章主要介紹了mysql函數(shù)IFNULL使用的及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11MySQL的InnoDB引擎入門(mén)學(xué)習(xí)教程
這篇文章主要介紹了MySQL的InnoDB引擎入門(mén)學(xué)習(xí)教程,對(duì)InnoDB的存儲(chǔ)結(jié)構(gòu)有一個(gè)較好的總結(jié),需要的朋友可以參考下2015-11-11mysql自動(dòng)插入百萬(wàn)模擬數(shù)據(jù)的操作代碼
這篇文章主要介紹了mysql自動(dòng)插入百萬(wàn)模擬數(shù)據(jù)的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10