亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL DBA教程:Mysql性能優化之緩存參數優化

2024-07-24 13:05:38
字體:
來源:轉載
供稿:網友

數據庫屬于 IO 密集型的應用程序,其主要職責就是數據的管理及存儲工作。而我們知道,從內存中讀取一個數據庫的時間是微秒級別,而從一塊普通硬盤上讀取一個IO是在毫秒級別,二者相差3個數量級。所以,要優化數據庫,首先第一步需要優化的就是 IO,盡可能將磁盤IO轉化為內存IO。本文先從 MySQL 數據庫IO相關參數(緩存參數)的角度來進行IO優化:

一、query_cache_size/query_cache_type (global)
    Query cache 作用于整個 MySQL Instance,主要用來緩存 MySQL 中的 ResultSet,也就是一條SQL語句執行的結果集,所以僅僅只能針對select語句。當我們打開了 Query Cache 功能,MySQL在接受到一條select語句的請求后,如果該語句滿足Query Cache的要求(未顯式說明不允許使用Query Cache,或者已經顯式申明需要使用Query Cache),MySQL 會直接根據預先設定好的HASH算法將接受到的select語句以字符串方式進行hash,然后到Query Cache 中直接查找是否已經緩存。也就是說,如果已經在緩存中,該select請求就會直接將數據返回,從而省略了后面所有的步驟(如 SQL語句的解析,優化器優化以及向存儲引擎請求數據等),極大的提高性能。

    當然,Query Cache 也有一個致命的缺陷,那就是當某個表的數據有任何任何變化,都會導致所有引用了該表的select語句在Query Cache 中的緩存數據失效。所以,當我們的數據變化非常頻繁的情況下,使用Query Cache 可能會得不償失。

    Query Cache的使用需要多個參數配合,其中最為關鍵的是 query_cache_size 和 query_cache_type ,前者設置用于緩存 ResultSet 的內存大小,后者設置在何場景下使用 Query Cache。在以往的經驗來看,如果不是用來緩存基本不變的數據的MySQL數據庫,query_cache_size 一般 256MB 是一個比較合適的大小。當然,這可以通過計算Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))來進行調整。query_cache_type可以設置為0(OFF),1(ON)或者2(DEMOND),分別表示完全不使用query cache,除顯式要求不使用query cache(使用sql_no_cache)之外的所有的select都使用query cache,只有顯示要求才使用query cache(使用sql_cache)。

二、binlog_cache_size (global)
    Binlog Cache 用于在打開了二進制日志(binlog)記錄功能的環境,是 MySQL 用來提高binlog的記錄效率而設計的一個用于短時間內臨時緩存binlog數據的內存區域。

    一般來說,如果我們的數據庫中沒有什么大事務,寫入也不是特別頻繁,2MB~4MB是一個合適的選擇。但是如果我們的數據庫大事務較多,寫入量比較大,可與適當調高binlog_cache_size。同時,我們可以通過binlog_cache_use 以及 binlog_cache_disk_use來分析設置的binlog_cache_size是否足夠,是否有大量的binlog_cache由于內存大小不夠而使用臨時文件(binlog_cache_disk_use)來緩存了。

三、key_buffer_size (global)
    Key Buffer 可能是大家最為熟悉的一個 MySQL 緩存參數了,尤其是在 MySQL 沒有更換默認存儲引擎的時候,很多朋友可能會發現,默認的 MySQL 配置文件中設置最大的一個內存參數就是這個參數了。key_buffer_size 參數用來設置用于緩存 MyISAM存儲引擎中索引文件的內存區域大小。如果我們有足夠的內存,這個緩存區域最好是能夠存放下我們所有的 MyISAM 引擎表的所有索引,以盡可能提高性能。

    此外,當我們在使用MyISAM 存儲的時候有一個及其重要的點需要注意,由于 MyISAM 引擎的特性限制了他僅僅只會緩存索引塊到內存中,而不會緩存表數據庫塊。所以,我們的 SQL 一定要盡可能讓過濾條件都在索引中,以便讓緩存幫助我們提高查詢效率。

四、bulk_insert_buffer_size (thread)
    和key_buffer_size一樣,這個參數同樣也僅作用于使用 MyISAM存儲引擎,用來緩存批量插入數據的時候臨時緩存寫入數據。當我們使用如下幾種數據寫入語句的時候,會使用這個內存區域來緩存批量結構的數據以幫助批量寫入數據文件:

  

復制代碼 代碼如下:

insert … select …

     insert … values (…) ,(…),(…)…

     load data infile… into… (非空表)

五、innodb_buffer_pool_size(global)
    當我們使用InnoDB存儲引擎的時候,innodb_buffer_pool_size 參數可能是影響我們性能的最為關鍵的一個參數了,他用來設置用于緩存 InnoDB 索引及數據塊的內存區域大小,類似于 MyISAM 存儲引擎的 key_buffer_size 參數,當然,可能更像是 Oracle 的 db_cache_size。簡單來說,當我們操作一個 InnoDB 表的時候,返回的所有數據或者去數據過程中用到的任何一個索引塊,都會在這個內存區域中走一遭。

    和key_buffer_size 對于 MyISAM 引擎一樣,innodb_buffer_pool_size 設置了 InnoDB 存儲引擎需求最大的一塊內存區域的大小,直接關系到 InnoDB存儲引擎的性能,所以如果我們有足夠的內存,盡可將該參數設置到足夠打,將盡可能多的 InnoDB 的索引及數據都放入到該緩存區域中,直至全部。

    我們可以通過 (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計算緩存命中率,并根據命中率來調整 innodb_buffer_pool_size 參數大小進行優化。

六、innodb_additional_mem_pool_size(global)
這個參數我們平時調整的可能不是太多,很多人都使用了默認值,可能很多人都不是太熟悉這個參數的作用。innodb_additional_mem_pool_size 設置了InnoDB存儲引擎用來存放數據字典信息以及一些內部數據結構的內存空間大小,所以當我們一個MySQL Instance中的數據庫對象非常多的時候,是需要適當調整該參數的大小以確保所有數據都能存放在內存中提高訪問效率的。

這個參數大小是否足夠還是比較容易知道的,因為當過小的時候,MySQL 會記錄 Warning 信息到數據庫的 error log 中,這時候你就知道該調整這個參數大小了。

七、innodb_log_buffer_size (global)
這是 InnoDB 存儲引擎的事務日志所使用的緩沖區。類似于 Binlog Buffer,InnoDB 在寫事務日志的時候,為了提高性能,也是先將信息寫入 Innofb Log Buffer 中,當滿足 innodb_flush_log_trx_commit 參數所設置的相應條件(或者日志緩沖區寫滿)之后,才會將日志寫到文件(或者同步到磁盤)中??梢酝ㄟ^ innodb_log_buffer_size 參數設置其可以使用的最大內存空間。
注:innodb_flush_log_trx_commit 參數對 InnoDB Log 的寫入性能有非常關鍵的影響。該參數可以設置為0,1,2,解釋如下:

0:log buffer中的數據將以每秒一次的頻率寫入到log file中,且同時會進行文件系統到磁盤的同步操作,但是每個事務的commit并不會觸發任何log buffer 到log file的刷新或者文件系統到磁盤的刷新操作;
1:在每次事務提交的時候將log buffer 中的數據都會寫入到log file,同時也會觸發文件系統到磁盤的同步;
2:事務提交會觸發log buffer 到log file的刷新,但并不會觸發磁盤文件系統到磁盤的同步。此外,每秒會有一次文件系統到磁盤同步操作。

此外,MySQL文檔中還提到,這幾種設置中的每秒同步一次的機制,可能并不會完全確保非常準確的每秒就一定會發生同步,還取決于進程調度的問題。實際上,InnoDB 能否真正滿足此參數所設置值代表的意義正常 Recovery 還是受到了不同 OS 下文件系統以及磁盤本身的限制,可能有些時候在并沒有真正完成磁盤同步的情況下也會告訴 mysqld 已經完成了磁盤同步。

八、innodb_max_dirty_pages_pct (global)
這個參數和上面的各個參數不同,他不是用來設置用于緩存某種數據的內存大小的一個參數,而是用來控制在 InnoDB Buffer Pool 中可以不用寫入數據文件中的Dirty Page 的比例(已經被修但還沒有從內存中寫入到數據文件的臟數據)。這個比例值越大,從內存到磁盤的寫入操作就會相對減少,所以能夠一定程度下減少寫入操作的磁盤IO。

但是,如果這個比例值過大,當數據庫 Crash 之后重啟的時間可能就會很長,因為會有大量的事務數據需要從日志文件恢復出來寫入數據文件中。同時,過大的比例值同時可能也會造成在達到比例設定上限后的 flush 操作“過猛”而導致性能波動很大。

上面這幾個參數是 MySQL 中為了減少磁盤物理IO而設計的主要參數,對 MySQL 的性能起到了至關重要的作用。

優化實例:
按照 mcsrainbow 朋友的要求,這里列一下根據以往經驗得到的相關參數的建議值:

1.query_cache_type : 如果全部使用innodb存儲引擎,建議為0,如果使用MyISAM 存儲引擎,建議為2,同時在SQL語句中顯式控制是否是喲你gquery cache
2.query_cache_size: 根據 命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))進行調整,一般不建議太大,256MB可能已經差不多了,大型的配置型靜態數據可適當調大
3.binlog_cache_size: 一般環境2MB~4MB是一個合適的選擇,事務較大且寫入頻繁的數據庫環境可以適當調大,但不建議超過32MB
4.key_buffer_size: 如果不使用MyISAM存儲引擎,16MB足以,用來緩存一些系統表信息等。如果使用 MyISAM存儲引擎,在內存允許的情況下,盡可能將所有索引放入內存,簡單來說就是“越大越好”
5.bulk_insert_buffer_size: 如果經常性的需要使用批量插入的特殊語句(上面有說明)來插入數據,可以適當調大該參數至16MB~32MB,不建議繼續增大,某人8MB
6.innodb_buffer_pool_size: 如果不使用InnoDB存儲引擎,可以不用調整這個參數,如果需要使用,在內存允許的情況下,盡可能將所有的InnoDB數據文件存放如內存中,同樣將但來說也是“越大越好”
7.innodb_additional_mem_pool_size: 一般的數據庫建議調整到8MB~16MB,如果表特別多,可以調整到32MB,可以根據error log中的信息判斷是否需要增大
8.innodb_log_buffer_size: 默認是1MB,系的如頻繁的系統可適當增大至4MB~8MB。當然如上面介紹所說,這個參數實際上還和另外的flush參數相關。一般來說不建議超過32MB
9.innodb_max_dirty_pages_pct: 根據以往的經驗,重啟恢復的數據如果要超過1GB的話,啟動速度會比較慢,幾乎難以接受,所以建議不大于 1GB/innodb_buffer_pool_size(GB)*100 這個值。當然,如果你能夠忍受啟動時間比較長,而且希望盡量減少內存至磁盤的flush,可以將這個值調整到90,但不建議超過90
注:以上取值范圍僅僅只是我的根據以往遇到的數據庫場景所得到的一些優化經驗值,并不一定適用于所有場景,所以在實際優化過程中還需要大家自己不斷的調整分析,也歡迎大家隨時通過 Mail 與我聯系溝通交流優化或者是架構方面的技術,一起探討相互學習。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国模在线视频| 91久热免费在线视频| 精品小视频在线| 在线观看欧美日韩国产| 中文字幕亚洲一区| 丁香五六月婷婷久久激情| 国产精品69久久久久| 日韩精品免费在线播放| 欧美最顶级丰满的aⅴ艳星| 免费91麻豆精品国产自产在线观看| 成人在线视频福利| 欧美电影免费播放| 欧美性视频在线| 亚洲美女性视频| 亚洲一区亚洲二区亚洲三区| 亚洲精品一区二区网址| 亚洲第一视频网站| 国产欧美一区二区三区四区| 精品国产一区二区三区久久狼黑人| 亚洲欧美国产va在线影院| 国产精品99久久99久久久二8| 久久99热这里只有精品国产| 亚洲国产女人aaa毛片在线| 国产亚洲精品美女久久久| 久久久国产精彩视频美女艺术照福利| 日韩在线播放一区| 欧美夫妻性生活视频| 亚洲最新av网址| 中日韩美女免费视频网址在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 日韩最新av在线| 精品福利一区二区| 91福利视频网| 秋霞午夜一区二区| 国产精品一区二区三区免费视频| 国产精品视频1区| 在线视频精品一| 欧美激情精品久久久久久免费印度| 久久久成人的性感天堂| 欧美一区第一页| 久久久久久久久久久亚洲| 欧美在线免费看| 国产精品一区二区三区免费视频| 国产不卡av在线免费观看| 欧美成人久久久| 久久琪琪电影院| 精品欧美国产一区二区三区| 久久精品亚洲94久久精品| 成人妇女免费播放久久久| 欧美中文字幕在线播放| 日韩成人网免费视频| 国产午夜精品视频免费不卡69堂| 亚洲精品少妇网址| 国内精品免费午夜毛片| 亚洲精品国产综合区久久久久久久| 国产在线视频2019最新视频| 欧美乱大交xxxxx另类电影| 国产精品日日摸夜夜添夜夜av| 日韩精品中文字幕在线| 日韩一区二区福利| 91av福利视频| 亚洲自拍偷拍色片视频| 亚洲欧美一区二区激情| 国产精品视频精品视频| 久久久久久久激情视频| 久久天天躁夜夜躁狠狠躁2022| 亚洲第一精品夜夜躁人人爽| 欧美日韩国产va另类| 91在线免费网站| 91在线精品视频| 日本乱人伦a精品| 欧美高清在线观看| 日韩女优在线播放| 日韩精品www| 亚洲精品久久久久久下一站| 国产精品久久久久久av下载红粉| 亚洲精品白浆高清久久久久久| 热草久综合在线| 欧美亚洲日本黄色| 国产欧美日韩丝袜精品一区| 日本精品视频在线| 国产日韩在线看片| 亚洲人成在线观看网站高清| 亚洲美女av电影| 国产一区二区在线免费视频| 欧美成人黑人xx视频免费观看| 亚洲欧洲在线播放| 中文字幕欧美视频在线| 亚洲国产免费av| 久久久国产精彩视频美女艺术照福利| 亚洲人成77777在线观看网| 欧美专区国产专区| 欧美成人亚洲成人日韩成人| 亚洲欧洲午夜一线一品| 亚洲人成在线电影| 一本大道亚洲视频| 亚洲色图激情小说| 日韩中文第一页| 国产亚洲aⅴaaaaaa毛片| 国产亚洲欧洲高清一区| 日韩中文字幕亚洲| 热99在线视频| 欧美疯狂xxxx大交乱88av| 97久久精品人人澡人人爽缅北| 亚洲国产日韩欧美在线图片| 日韩中文字幕在线看| 久久不射电影网| 国产亚洲精品久久久久动| 精品成人国产在线观看男人呻吟| 中文字幕精品一区久久久久| 亚洲欧美国产视频| 国产亚洲精品久久久久动| 午夜精品99久久免费| 亚洲国产精品va在线观看黑人| 久久99久久久久久久噜噜| 日本久久中文字幕| 伊人久久大香线蕉av一区二区| 91大神在线播放精品| 91久久国产精品91久久性色| 亚洲最大av网站| 91在线观看免费高清| 欧美专区国产专区| 亚洲精品一二区| 揄拍成人国产精品视频| 国产精品一久久香蕉国产线看观看| **欧美日韩vr在线| 成人黄色大片在线免费观看| 欧美孕妇与黑人孕交| 永久免费毛片在线播放不卡| 91在线直播亚洲| 亚洲片在线资源| 影音先锋欧美精品| 精品视频在线观看日韩| 最近中文字幕2019免费| 亚洲欧美日韩在线一区| 欧美日韩亚洲一区二区| 狠狠综合久久av一区二区小说| 国产视频亚洲精品| 国产在线999| 欧美大片免费观看在线观看网站推荐| 欧美极品少妇xxxxⅹ裸体艺术| 91高清免费视频| 国产一区私人高清影院| 国产精品白丝av嫩草影院| 福利精品视频在线| 欧美一级免费看| 伊人久久大香线蕉av一区二区| 日韩av网址在线| 在线电影av不卡网址| 日韩欧美亚洲综合| 久久欧美在线电影| 日韩成人av网| 久久久久久亚洲| 亚洲精品v天堂中文字幕| 欧美麻豆久久久久久中文| 国产精品羞羞答答| 欧美黑人一区二区三区| 久久激情视频免费观看| 精品久久久久久久久中文字幕| 精品自在线视频| 亚洲自拍偷拍一区| 欧美精品激情在线| 亚洲精品资源美女情侣酒店| 中日韩午夜理伦电影免费|