Q:innodb buffer pool和Qcache的緩存區(qū)別?

A:

  1、Qcacche緩存的是SQL語句及對應的結果集,緩存在內(nèi)存,最簡單的情況是SQL一直不重復,那Qcache的命令率肯定是0;

  2、buffer pool中緩存的是整張表中的數(shù)據(jù),緩存在內(nèi)存,SQL再變只要數(shù)據(jù)都在內(nèi)存,那么命中率就是100%。

 

一、查詢緩存(QueryCache)

1、關于查詢緩存機制

  開啟了緩存,會自動將查詢語句和結果集返回到內(nèi)存,下次再查直接從內(nèi)存中取;

  查詢緩存會跟蹤系統(tǒng)中每張表,若表發(fā)生變化,則和該張表相關的所有查詢緩存全部失效,這是和buffer pool緩存機制很大的區(qū)別;

  檢查查詢緩存時,MYSQL不會對SQL做任何處理,它精確的使用客戶端傳來的查詢,只要字符大小寫或注釋有點不同,查詢緩存就認為是不同的查詢;

  任何一個包含不確定的函數(shù)(比如now()、curren_date())的查詢不會被緩存。

注意:

  查詢緩存可改善性能,但是開啟查詢緩存對讀寫增加了額外開銷。

  1、對于讀,在查詢前需先檢查緩存;

  2、對于寫,寫入后需更新緩存。

  一般情況下這些開銷相對較小,因此需要根據(jù)業(yè)務權衡是否開啟查詢緩存。

2、Qcache參數(shù)

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

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             | 1048576 || query_cache_type             | OFF     || query_cache_wlock_invalidate | OFF     |+------------------------------+---------+

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

參數(shù)解析:

  1、have_query_cache:該MySQL是否支持Query Cache;

  2、query_cache_limit:緩存塊大小,超過該大小不會被緩存

  3、query_cache_min_res_unit:每個qcache最小的緩存空間大小

  4、query_cache_size:分配給查詢緩存的總內(nèi)存

  5、query_cache_type:是否開啟查詢緩存

  6、query_cache_wlock_invalidate:控制當有鎖加在表上的時候,是否先讓該表相關的 Query Cache失效

3、配置查詢緩存:在配置文件中修改如下參數(shù)

  query_cache_type = on  #開啟查詢緩存

  query_cache_size = 200M  #分配給查詢緩存的總內(nèi)存,一般建議不超過256M

  query_cache_limit = 1M  #限制MySQL存儲的最大結果;如果查詢的結果比limit大,那么就不會被緩存。

4、監(jiān)控Qcache使用情況

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

mysql> show status like 'qcache%'; 
+-------------------------+---------+| Variable_name           | Value   |+-------------------------+---------+| Qcache_free_blocks      | 1       || Qcache_free_memory      | 1031832 || Qcache_hits             | 0       || Qcache_inserts          | 0       || Qcache_lowmem_prunes    | 0       || Qcache_not_cached       | 5476    || Qcache_queries_in_cache | 0       || Qcache_total_blocks     | 1       |+-------------------------+---------+

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

解析:

  1、Qcache_free_blocks :Query Cache中目前還有多少剩余的blocks。如果該值顯示較大,則說明Query Cache中的內(nèi)存碎片較多了,可能需要尋找合適的機會進行整理。處理辦法:mysql> FLUSH QUERY CACHE;清理查詢緩存碎片以提高內(nèi)存使用性能。(該語句不從緩存中移出任何查詢)

  2、Qcache_free_memory:Query Cache 中目前剩余的內(nèi)存大小

  3、Qcache_hits:緩存命中次數(shù)

  4、Qcache_inserts:多少次未命中然后插入

Query Cache命中率 = Qcache_hits /(Qcache_hits + Qcache_inserts)

  5、Qcache_lowmem_prunes:多少條Query 因為內(nèi)存不足而被清除出Query

  6、Qcache_not_cached:因為query_cache_type的設置off或者不能被cache的Query的數(shù)量

  7、Qcache_queries_in_cache:當前Query Cache中cache的Query數(shù)量

  8、Qcache_total_blocks:當前Query Cache中的block數(shù)量

注:

  命中率低,說明沒從內(nèi)存中取,還是從磁盤取,則多走了一步??词欠駍ql老變還是什么問題;

  Qcache_not_cached 數(shù)值大,開啟了查詢緩存沒有緩存的數(shù)據(jù)則說明設置緩存的大小太小了,好多無法緩存。

 

二、存儲引擎層-innodb buffer pool

  buffer pool是innodb存儲引擎帶的一個緩存池,查詢數(shù)據(jù)的時候,它首先會從內(nèi)存中查詢,如果內(nèi)存中存在的話,直接返回,從而提高查詢響應時間。Buffer pool是設置的越大越好,一般設置為服務器物理內(nèi)存的70%。

1、Innodb_buffer_pool參數(shù)

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

mysql> show variables like '%innodb_buffer_pool%';+-------------------------------------+----------------+| Variable_name                       | Value          |+-------------------------------------+----------------+| innodb_buffer_pool_chunk_size       | 134217728      || innodb_buffer_pool_dump_at_shutdown | ON             || innodb_buffer_pool_dump_now         | OFF            || innodb_buffer_pool_dump_pct         | 25             || innodb_buffer_pool_filename         | ib_buffer_pool || innodb_buffer_pool_instances        | 1              || innodb_buffer_pool_load_abort       | OFF            || innodb_buffer_pool_load_at_startup  | ON             || innodb_buffer_pool_load_now         | OFF            || innodb_buffer_pool_size             | 134217728      |+-------------------------------------+----------------+

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

參數(shù)解析:

  1、innodb_buffer_pool_size:Innodb_buffer_pool的大小

  2、innodb_buffer_pool_filename :熱數(shù)據(jù)文件名稱

  3、innodb_buffer_pool_dump_now:默認是OFF;如果開啟則立刻InnoDB將InnoDB緩沖池中的熱數(shù)據(jù)保存到本地硬盤。(組合innodb_buffer_pool_load_now使用)

  4、innodb_buffer_pool_load_now:默認是OFF;如果開啟則立刻通過加載數(shù)據(jù)頁預熱innodb緩沖池。

  5、innodb_buffer_pool_load_at_startup:默認是OFF;如果開啟該參數(shù),啟動MySQL服務時,MySQL將本地熱數(shù)據(jù)加載到InnoDB緩沖池中。

  6、innodb_buffer_pool_dump_at_shutdown:默認是OFF;如果開啟該參數(shù),停止mysq服務時是否自動保存InnoDB buffer pool中熱數(shù)據(jù)。

Q:如何快速重啟使用數(shù)據(jù)庫---Preloading the InnoDB Buffer Pool for Faster Restart

A:

  開啟innodb_buffer_pool_load_at_startup、innodb_buffer_pool_dump_at_shutdown參數(shù)。重啟數(shù)據(jù)庫,停止時保存熱數(shù)據(jù),啟動時加載熱數(shù)據(jù)到buffer pool。

2、Innodb_buffer_pool狀態(tài)

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

mysql> show status like '%innodb_buffer_pool%';+---------------------------------------+--------------------------------------------------+| Variable_name                         | Value                                            |+---------------------------------------+--------------------------------------------------+| Innodb_buffer_pool_dump_status        | Dumping of buffer pool not started               || Innodb_buffer_pool_load_status        | Buffer pool(s) load completed at 170430  7:07:12 || Innodb_buffer_pool_resize_status      |                                                  || Innodb_buffer_pool_pages_data         | 241                                              || Innodb_buffer_pool_bytes_data         | 3948544                                          || Innodb_buffer_pool_pages_dirty        | 0                                                || Innodb_buffer_pool_bytes_dirty        | 0                                                || Innodb_buffer_pool_pages_flushed      | 176                                              || Innodb_buffer_pool_pages_free         | 7951                                             || Innodb_buffer_pool_pages_misc         | 0                                                || Innodb_buffer_pool_pages_total        | 8192                                             || Innodb_buffer_pool_read_ahead_rnd     | 0                                                || Innodb_buffer_pool_read_ahead         | 0                                                || Innodb_buffer_pool_read_ahead_evicted | 0                                                || Innodb_buffer_pool_read_requests      | 53710                                            || Innodb_buffer_pool_reads              | 201                                              || Innodb_buffer_pool_wait_free          | 0                                                || Innodb_buffer_pool_write_requests     | 45242                                            |+---------------------------------------+--------------------------------------------------+

平面設計培訓,網(wǎng)頁設計培訓,美工培訓,游戲開發(fā),動畫培訓

  Innodb_buffer_pool_read_requests  #邏輯讀(緩存讀)請求次數(shù),也是讀的請求次數(shù)

  Innodb_buffer_pool_reads  #從物理磁盤中獲取到數(shù)據(jù)的次數(shù)

注:

  邏輯讀就是從buffer pool的讀,但是也會包含物理讀,因為物理讀也要是先將從disk中讀取的數(shù)據(jù)放入buffer pool里,然后再進行邏輯讀。所以:總的邏輯讀也就是讀的請求次數(shù)。

讀的命中率=(Innodb_buffer_pool_read_requests- Innodb_buffer_pool_reads)/ Innodb_buffer_pool_read_requests

@author:http://www.cnblogs.com/geaozhang/

http://www.cnblogs.com/geaozhang/p/7147746.html