国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

Mysql的查詢緩存區的優化

2024-07-24 12:40:06
字體:
來源:轉載
供稿:網友

作者:askwan@流年飄飄『AskWan』-萬志華的網絡家園
地址:http://www.askwan.com/post/143/
保留文章版權。轉載時請勿必以鏈接形式注明作者和原始出處及本聲明!

本文接著我的上篇文章來
Mysql的查詢緩存區query cache   http://www.askwan.com/post/141/

查看查詢緩存區的相關變量:


mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                 | Value     |
+------------------------------+----------+
| have_query_cache             | YES       |
| query_cache_limit             | 1048576   |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+----------+
6 rows in set (0.00 sec)


have_query_cache  
是否支持查詢緩存區 “YES”表是支持查詢緩存區

query_cache_limit  可緩存的Select查詢結果的最大值 1048576 byte /1024 = 1024kB 即最大可緩存的select查詢結果必須小于1024KB

query_cache_min_res_unit 每次給query cache結果分配內存的大小 默認是 4096 byte 也即 4kB

在這里,我延伸三點重要的東西

1.當查詢進行的時候,Mysql把查詢結果保存在qurey cache中,但是有時候要保存的結果比較大,超過了query_cache_min_res_unit的值 ,這時候mysql將一邊檢索結果,一邊進行慢慢保存結果,所以,有時候并不是
把所有結果全部得到后再進行一次性保存,而是每次分配一塊query_cache_min_res_unit 大小的內存空間保存結果集,
使用完后,接著再分配一個這樣的塊,如果還不不夠,接著再分配一個塊,依此類推,也就是說,有可能在一次查詢中,
mysql要進行多次內存分配的操作,而我們應該知道,頻繁操作內存都是要耗費時間的。

2. 內存碎片的產生。當一塊分配的內存沒有完全使用時,MySQL會把這塊內存Trim掉,把沒有使用的那部分歸還以重復利用。比如,第一次分配4KB,只用 了3KB,剩1KB,第二次連續操作,分配4KB,用了2KB,剩2KB,這兩次連續操作共剩下的1KB+2KB=3KB,不足以做個一個內存單元分配, 這時候,內存碎片便產生了。

3.內存塊的概念,先看下這個:

mysql> show status like 'qcache%';
+-------------------------+----------+
| Variable_name           | Value     |
+-------------------------+----------+
| Qcache_free_blocks       | 5096     |
| Qcache_free_memory       | 18964096 |
| Qcache_hits             | 12192192 |
| Qcache_inserts           | 3560370   |
| Qcache_lowmem_prunes     | 17326     |
| Qcache_not_cached       | 303599   |
| Qcache_queries_in_cache | 10201     |
| Qcache_total_blocks     | 25937     |
+-------------------------+----------+
8 rows in set (0.00 sec)


Qcache_total_blocks  表示所有的塊

Qcache_free_blocks  表示未使用的塊 這個值比較大,那意味著,內存碎片比較多,用flush query cache清理后,
為被使用的塊其值應該為1或0 ,因為這時候所有的內存都做為一個連續的快在一起了:

mysql> show status like 'qcache%';
+-------------------------+----------+
| Variable_name           | Value     |
+-------------------------+----------+
| Qcache_free_blocks       | 1         |
| Qcache_free_memory       | 18539240 |
| Qcache_hits             | 12192502 |
| Qcache_inserts           | 3560515   |
| Qcache_lowmem_prunes     | 17326     |
| Qcache_not_cached       | 303607   |
| Qcache_queries_in_cache | 10318     |
| Qcache_total_blocks     | 21081     |
+-------------------------+----------+
8 rows in set (0.00 sec)

其他幾個狀態變量的意義:

Qcache_free_memory    表示查詢緩存區現在還有多少的可用內存
Qcache_hits        表示查詢緩存區的命中個數,也就是直接從查詢緩存區作出響應處理的查詢個數
Qcache_inserts    表示查詢緩存區此前總過緩存過多少條查詢命令的結果
Qcache_lowmem_prunes   表示查詢緩存區已滿而從其中溢出和刪除的查詢結果的個數
Qcache_not_cached    表示沒有進入查詢緩存區的查詢命令個數
Qcache_queries_in_cache 查詢緩存區當前緩存著多少條查詢命令的結果

優化提示:
如果Qcache_lowmem_prunes 值比較大,表示查詢緩存區大小設置太小,需要增大。
如果Qcache_free_blocks 較多,表示內存碎片較多,需要清理,flush query cache
根據我看的 《High Performance MySQL》中所述,關于query_cache_min_res_unit大小的調優
,書中給出了一個計算公式,可以供調優設置參考:
query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache

還要注意一點的是,FLUSH QUERY CACHE 命令可以用來整理查詢緩存區的碎片,改善內存使用狀況,
但不會清理查詢緩存區的內容,這個要和RESET QUERY CACHE相區別,不要混淆,后者才是清除查詢緩存區中
的所有的內容。

-------------------END--------------------
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东源县| 隆回县| 柘荣县| 平定县| 湖北省| 会同县| 阿克| 文登市| 临泉县| 长丰县| 若羌县| 濮阳市| 鄱阳县| 且末县| 郯城县| 永宁县| 滕州市| 若尔盖县| 平顶山市| 汉阴县| 台东市| 永新县| 南华县| 台湾省| 大姚县| 玉门市| 安康市| 九寨沟县| 灵川县| 周宁县| 青神县| 连城县| 台湾省| 兴文县| 石家庄市| 东兰县| 高雄市| 琼结县| 资源县| 海林市| 锦州市|