JAVA—咖啡館

          ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          mysql cache功能分析:

          1 mysql的cache功能的key的生成原理是:把select語句按照一定的hash規則生成唯一的key,select的結果生成value,即 key=>value。所以對于cache而言,select語句是區分大小寫的,也區分空格的。兩個select語句必須完完全 全一致,才能夠獲取到同一個cache。

          2 生成cache之后,只要該select中涉及到的table有任何的數據變動(insert,update,delete操作等),相 關的所有cache都會被刪除。因此只有數據很少變動的table,引入mysql 的cache才較有意義。關于這方面的測試,可以參考:《Query Cache,看上去很美》一文。

          所以,mysql的cache功能只適用于下列場合:數據變動較少,select較多的table。

          那么。在復雜的系統中,如何使用mysql的cache功能呢,基本方法如下:

          配置query_cache_type,同時改寫程序。

          query_cache_type 0 代表不使用緩沖, 1 代表使用緩沖,2 代表根據需要使用。

          設置 1 代表緩沖永遠有效,如果不需要緩沖,就需要使用如下語句:

          SELECT SQL_NO_CACHE * FROM my_table WHERE …

          如果設置為 2 ,需要開啟緩沖,可以用如下語句:

          SELECT SQL_CACHE * FROM my_table WHERE …

          So,最簡單又可靠的做法是:把query_cache_type設置為2,然后在需要提高select速度的地方,使用:

          SELECT SQL_CACHE * FROM…

          的方式進行SELECT。

          【mysql cache調試筆記】

          1 可以使用下列命令開啟mysql的select cache功能:

          SET GLOBAL query_cache_size = 102400000;

          因為當query_cache_size默認為0時,是不開啟cache功能的。

          2 調試:

          查看cache的設置:

          show variables like ‘%query_cache%’;

          性能監控:

          show status like ‘%Qcache%’;

          3 mysql cache的清理:

          可以使用FLUSH QUERY CACHE語句來清理查詢緩存碎片以提高內存使用性能。該語句不從緩存中移出任何查詢。

          RESET QUERY CACHE語句從查詢緩存中移出所有查詢。FLUSH TABLES語句也執行同樣的工作。


          Query Cache

          當你的數據庫打開了Query Cache(簡稱QC)功能后,數據庫在執行SELECT語句時,會將其結果放到QC中,當下一次處理同樣的SELECT請求時,數據庫就會從QC取得結 果,而不需要去數據表中查詢。

          在這個“Cache為王”的時代,我們總是通過不同的方式去緩存我們的結果從而提高響應效率,但一個緩存機制是否有效,效果如何,卻是一個需要好好 思考的問題。在MySQL中的Query Cache就是一個適用較少情況的緩存機制。在上圖中,如果緩存命中率非常高的話,有測試表明在極端情況下可以提高效率238%[1]。 但實際情況如何?Query Cache有如下規則,如果數據表被更改,那么和這個數據表相關的全部Cache全部都會無效,并刪除之。這里“數據表更改”包括: INSERTUPDATEDELETETRUNCATEALTER TABLEDROP TABLE, orDROP DATABASE等。舉 個例子,如果數據表posts訪問頻繁,那么意味著它的很多數據會被QC緩存起來,但是每一次posts數據表的更新,無論更新是不是影響到了cache 的數據,都會將全部和posts表相關的cache清除。如果你的數據表更新頻繁的話,那么Query Cache將會成為系統的負擔。有實驗表明,糟糕時,QC會降低系統13%[1]的處理能力。

          如果你的應用對數據庫的更新很少,那么QC將會作用顯著。比較典型的如博客系統,一般博客更新相對較慢,數據表相對穩定不變,這時候QC的作用會比 較明顯。

          再如,一個更新頻繁的BBS系統。下面是一個實際運行的論壇數據庫的狀態參數:

          QCache_hit 5280438
          QCache_insert 8008948
          Qcache_not_cache 95372
          Com select 8104159

          可以看到,數據庫一共往QC中寫入了約800W次緩存,但是實際命中的只有約500W次。也就是說,每一個緩存的使用率約為0.66次。很難說,該 緩存的作用是否大于QC系統所帶來的開銷。但是有一點是很肯定的,QC緩存的作用是很微小的,如果應用層能夠實現緩存,將可以忽略QC的效果。

          ————-下面是關于QC的一些其他細節—————–

          一、Query Cache相關參數:

          • query_cache_size QC占用空間大小,通過將其設置為0關閉QC功能
          • query_cache_type 0表示關閉QC;1表示正常緩存;2表示SQL_CACHE才緩存
          • query_cache_limit 最大緩存結果集
          • query_cache_min_res_unit 手冊上說,QC會按照這個值分配緩存block的大小。
          • Qcache_lowmem_prunes 這是一個狀態變量(show status),當緩存空間不夠需要釋放舊的緩存時,該值會自增。

          二、Query Cache觀察:

          CREATE TABLE t1(id INT,var1 varchar(10));
          //Com_select:8 Qcache_hits:1
          INSERT INTO t1 VALUES(1,’WWW’);
          //Com_select:8 Qcache_hits:1
          SELECT * FROM t1 WHERE id=1;
          //Com_select:9 Qcache_hits:1
          SELECT * FROM t1 WHERE id=1;
          //Com_select:9 Qcache_hits:2 Qcache_queries_in_cache:1
          INSERT INTO t1 VALUES(2,’RRRR’);
          //Com_select:9 Qcache_hits:2 Qcache_queries_in_cache:0
          SELECT * FROM t1 WHERE id=1; //INSERT后Cache失效
          //Com_select:10 Qcache_hits:2 Qcache_queries_in_cache:1

          參考:

          1. http://dev.mysql.com/doc/refman/5.0/en/query-cache.html
          2. http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html
          3. http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/
          posted on 2015-09-10 19:20 rogerfan 閱讀(436) 評論(0)  編輯  收藏 所屬分類: 【數據庫】
          主站蜘蛛池模板: 通河县| 新野县| 抚远县| 绥宁县| 辽中县| 芜湖市| 崇礼县| 河北省| 会理县| 宜兰县| 永春县| 息烽县| 万宁市| 涟源市| 嘉祥县| 博白县| 京山县| 临沂市| 藁城市| 习水县| 阜宁县| 邮箱| 光山县| 新巴尔虎左旗| 盖州市| 理塘县| 扎兰屯市| 通海县| 阿尔山市| 仁布县| 抚顺县| 汝阳县| 两当县| 奉化市| 万盛区| 定西市| 温宿县| 吴堡县| 白河县| 弥勒县| 普兰县|