最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL常見的底層優(yōu)化操作教程及相關(guān)建議

 更新時間:2015年12月10日 09:37:14   投稿:goldensun  
這篇文章主要介紹了MySQL常見的底層優(yōu)化操作教程及相關(guān)建議,包括對運行操作系統(tǒng)的硬件方面及存儲引擎參數(shù)的調(diào)整等零碎方面的小整理,需要的朋友可以參考下

1、硬件層相關(guān)優(yōu)化

1.1、CPU相關(guān)

   在服務(wù)器的BIOS設(shè)置中,可調(diào)整下面的幾個配置,目的是發(fā)揮CPU最大性能,或者避免經(jīng)典的NUMA問題:

(1)、選擇Performance Per Watt Optimized(DAPC)模式,發(fā)揮CPU最大性能,跑DB這種通常需要高運算量的服務(wù)就不要考慮節(jié)電了;
(2)、關(guān)閉C1E和C States等選項,目的也是為了提升CPU效率;
(3)、Memory Frequency(內(nèi)存頻率)選擇Maximum Performance(最佳性能);

(4)、內(nèi)存設(shè)置菜單中,啟用Node Interleaving,避免NUMA問題;
1.2、磁盤I/O相關(guān)

   下面幾個是按照IOPS性能提升的幅度排序,對于磁盤I/O可優(yōu)化的一些措施:

(1)、使用SSD或者PCIe SSD設(shè)備,至少獲得數(shù)百倍甚至萬倍的IOPS提升;
(2)、購置陣列卡同時配備CACHE及BBU模塊,可明顯提升IOPS(主要是指機(jī)械盤,SSD或PCIe SSD除外。同時需要定期檢查CACHE及BBU模塊的健康狀況,確保意外時不至于丟失數(shù)據(jù));

(3)、有陣列卡時,設(shè)置陣列寫策略為WB,甚至FORCE WB(若有雙電保護(hù),或?qū)?shù)據(jù)安全性要求不是特別高的話),嚴(yán)禁使用WT策略。并且閉陣列預(yù)讀策略,基本上是雞肋,用處不大;

(4)、盡可能選用RAID-10,而非RAID-5;

(5)、使用機(jī)械盤的話,盡可能選擇高轉(zhuǎn)速的,例如選用15KRPM,而不是7.2KRPM的盤,不差幾個錢的;
2、系統(tǒng)層相關(guān)優(yōu)化

2.1、文件系統(tǒng)層優(yōu)化

   在文件系統(tǒng)層,下面幾個措施可明顯提升IOPS性能:

(1)、使用deadline/noop這兩種I/O調(diào)度器,千萬別用cfq(它不適合跑DB類服務(wù));
(2)、使用xfs文件系統(tǒng),千萬別用ext3;ext4勉強(qiáng)可用,但業(yè)務(wù)量很大的話,則一定要用xfs;

(3)、文件系統(tǒng)mount參數(shù)中增加:noatime, nodiratime, nobarrier幾個選項(nobarrier是xfs文件系統(tǒng)特有的);
2.2、其他內(nèi)核參數(shù)優(yōu)化

   針對關(guān)鍵內(nèi)核參數(shù)設(shè)定合適的值,目的是為了減少swap的傾向,并且讓內(nèi)存和磁盤I/O不會出現(xiàn)大幅波動,導(dǎo)致瞬間波峰負(fù)載:

(1)、將vm.swappiness設(shè)置為5-10左右即可,甚至設(shè)置為0(RHEL 7以上則慎重設(shè)置為0,除非你允許OOM kill發(fā)生),以降低使用SWAP的機(jī)會;
(2)、將vm.dirty_background_ratio設(shè)置為5-10,將vm.dirty_ratio設(shè)置為它的兩倍左右,以確保能持續(xù)將臟數(shù)據(jù)刷新到磁盤,避免瞬間I/O寫,產(chǎn)生嚴(yán)重等待(和MySQL中的innodb_max_dirty_pages_pct類似);

(3)、將net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都設(shè)置為1,減少TIME_WAIT,提高TCP效率;

(4)、至于網(wǎng)傳的read_ahead_kb、nr_requests這兩個參數(shù),我經(jīng)過測試后,發(fā)現(xiàn)對讀寫混合為主的OLTP環(huán)境影響并不大(應(yīng)該是對讀敏感的場景更有效果),不過沒準(zhǔn)是我測試方法有問題,可自行斟酌是否調(diào)整;

3、MySQL層相關(guān)優(yōu)化

3.1、關(guān)于版本選擇

   官方版本我們稱為ORACLE MySQL,這個沒什么好說的,相信絕大多數(shù)人會選擇它。

   我個人強(qiáng)烈建議選擇Percona分支版本,它是一個相對比較成熟的、優(yōu)秀的MySQL分支版本,在性能提升、可靠性、管理型方面做了不少改善。它和官方ORACLE MySQL版本基本完全兼容,并且性能大約有20%以上的提升,因此我優(yōu)先推薦它,我自己也從2008年一直以它為主。

   另一個重要的分支版本是MariaDB,說MariaDB是分支版本其實已經(jīng)不太合適了,因為它的目標(biāo)是取代ORACLE MySQL。它主要在原來的MySQL Server層做了大量的源碼級改進(jìn),也是一個非??煽康摹?yōu)秀的分支版本。但也由此產(chǎn)生了以GTID為代表的和官方版本無法兼容的新特性(MySQL 5.7開始,也支持GTID模式在線動態(tài)開啟或關(guān)閉了),也考慮到絕大多數(shù)人還是會跟著官方版本走,因此沒優(yōu)先推薦MariaDB。

3.2、關(guān)于最重要的參數(shù)選項調(diào)整建議

   建議調(diào)整下面幾個關(guān)鍵參數(shù)以獲得較好的性能:
(1)、選擇Percona或MariaDB版本的話,強(qiáng)烈建議啟用thread pool特性,可使得在高并發(fā)的情況下,性能不會發(fā)生大幅下降。此外,還有extra_port功能,非常實用, 關(guān)鍵時刻能救命的。還有另外一個重要特色是 QUERY_RESPONSE_TIME 功能,也能使我們對整體的SQL響應(yīng)時間分布有直觀感受;

(2)、設(shè)置default-storage-engine=InnoDB,也就是默認(rèn)采用InnoDB引擎,強(qiáng)烈建議不要再使用MyISAM引擎了,InnoDB引擎絕對可以滿足99%以上的業(yè)務(wù)場景;

(3)、調(diào)整innodb_buffer_pool_size大小,如果是單實例且絕大多數(shù)是InnoDB引擎表的話,可考慮設(shè)置為物理內(nèi)存的50% ~ 70%左右;

(4)、根據(jù)實際需要設(shè)置innodb_flush_log_at_trx_commit、sync_binlog的值。如果要求數(shù)據(jù)不能丟失,那么兩個都設(shè)為1。如果允許丟失一點數(shù)據(jù),則可分別設(shè)為2和10。而如果完全不用care數(shù)據(jù)是否丟失的話(例如在slave上,反正大不了重做一次),則可都設(shè)為0。這三種設(shè)置值導(dǎo)致數(shù)據(jù)庫的性能受到影響程度分別是:高、中、低,也就是第一個會另數(shù)據(jù)庫最慢,最后一個則相反;

(5)、設(shè)置innodb_file_per_table = 1,使用獨立表空間,我實在是想不出來用共享表空間有什么好處了;

(6)、設(shè)置innodb_data_file_path = ibdata1:1G:autoextend,千萬不要用默認(rèn)的10M,否則在有高并發(fā)事務(wù)時,會受到不小的影響;

(7)、設(shè)置innodb_log_file_size=256M,設(shè)置innodb_log_files_in_group=2,基本可滿足90%以上的場景;

(8)、設(shè)置long_query_time = 1,而在5.5版本以上,已經(jīng)可以設(shè)置為小于1了,建議設(shè)置為0.05(50毫秒),記錄那些執(zhí)行較慢的SQL,用于后續(xù)的分析排查;

(9)、根據(jù)業(yè)務(wù)實際需要,適當(dāng)調(diào)整max_connection(最大連接數(shù))、max_connection_error(最大錯誤數(shù),建議設(shè)置為10萬以上,而open_files_limit、innodb_open_files、table_open_cache、table_definition_cache這幾個參數(shù)則可設(shè)為約10倍于max_connection的大?。?/p>

(10)、常見的誤區(qū)是把tmp_table_size和max_heap_table_size設(shè)置的比較大,曾經(jīng)見過設(shè)置為1G的,這2個選項是每個連接會話都會分配的,因此不要設(shè)置過大,否則容易導(dǎo)致OOM發(fā)生;其他的一些連接會話級選項例如:sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size等,也需要注意不能設(shè)置過大;

(11)、由于已經(jīng)建議不再使用MyISAM引擎了,因此可以把key_buffer_size設(shè)置為32M左右,并且強(qiáng)烈建議關(guān)閉query cache功能;
3.3、關(guān)于Schema設(shè)計規(guī)范及SQL使用建議

   下面列舉了幾個常見有助于提升MySQL效率的Schema設(shè)計規(guī)范及SQL使用建議:

(1)、所有的InnoDB表都設(shè)計一個無業(yè)務(wù)用途的自增列做主鍵,對于絕大多數(shù)場景都是如此,真正純只讀用InnoDB表的并不多,真如此的話還不如用TokuDB來得劃算;

(2)、字段長度滿足需求前提下,盡可能選擇長度小的。此外,字段屬性盡量都加上NOT NULL約束,可一定程度提高性能;

(3)、盡可能不使用TEXT/BLOB類型,確實需要的話,建議拆分到子表中,不要和主表放在一起,避免SELECT * 的時候讀性能太差。

(4)、讀取數(shù)據(jù)時,只選取所需要的列,不要每次都SELECT *,避免產(chǎn)生嚴(yán)重的隨機(jī)讀問題,尤其是讀到一些TEXT/BLOB列;

(5)、對一個VARCHAR(N)列創(chuàng)建索引時,通常取其50%(甚至更小)左右長度創(chuàng)建前綴索引就足以滿足80%以上的查詢需求了,沒必要創(chuàng)建整列的全長度索引;

(6)、通常情況下,子查詢的性能比較差,建議改造成JOIN寫法;

(7)、多表聯(lián)接查詢時,關(guān)聯(lián)字段類型盡量一致,并且都要有索引;

(8)、多表連接查詢時,把結(jié)果集小的表(注意,這里是指過濾后的結(jié)果集,不一定是全表數(shù)據(jù)量小的)作為驅(qū)動表;

(9)、多表聯(lián)接并且有排序時,排序字段必須是驅(qū)動表里的,否則排序列無法用到索引;

(10)、多用復(fù)合索引,少用多個獨立索引,尤其是一些基數(shù)(Cardinality)太小(比如說,該列的唯一值總數(shù)少于255)的列就不要創(chuàng)建獨立索引了;

(11)、類似分頁功能的SQL,建議先用主鍵關(guān)聯(lián),然后返回結(jié)果集,效率會高很多;
3.4、其他建議

   關(guān)于MySQL的管理維護(hù)的其他建議有:

(1)、通常地,單表物理大小不超過10GB,單表行數(shù)不超過1億條,行平均長度不超過8KB,如果機(jī)器性能足夠,這些數(shù)據(jù)量MySQL是完全能處理的過來的,不用擔(dān)心性能問題,這么建議主要是考慮ONLINE DDL的代價較高;

(2)、不用太擔(dān)心mysqld進(jìn)程占用太多內(nèi)存,只要不發(fā)生OOM kill和用到大量的SWAP都還好;

(3)、在以往,單機(jī)上跑多實例的目的是能最大化利用計算資源,如果單實例已經(jīng)能耗盡大部分計算資源的話,就沒必要再跑多實例了;

(4)、定期使用pt-duplicate-key-checker檢查并刪除重復(fù)的索引。定期使用pt-index-usage工具檢查并刪除使用頻率很低的索引;

(5)、定期采集slow query log,用pt-query-digest工具進(jìn)行分析,可結(jié)合Anemometer系統(tǒng)進(jìn)行slow query管理以便分析slow query并進(jìn)行后續(xù)優(yōu)化工作;

(6)、可使用pt-kill殺掉超長時間的SQL請求,Percona版本中有個選項 innodb_kill_idle_transaction 也可實現(xiàn)該功能;

(7)、使用pt-online-schema-change來完成大表的ONLINE DDL需求;

(8)、定期使用pt-table-checksum、pt-table-sync來檢查并修復(fù)mysql主從復(fù)制的數(shù)據(jù)差異;

相關(guān)文章

  • Mysql如何在線添加索引

    Mysql如何在線添加索引

    這篇文章主要介紹了Mysql如何在線添加索引問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL 5.7.18 免安裝版配置教程

    MySQL 5.7.18 免安裝版配置教程

    這篇文章主要為大家詳細(xì)介紹了MySQL 5.7.18 免安裝版配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 教你3個步驟為Mysql添加只讀賬號

    教你3個步驟為Mysql添加只讀賬號

    只要公司有數(shù)據(jù)團(tuán)隊的那免不了讓這幫家伙把全公司的數(shù)據(jù)庫數(shù)據(jù)都摸一遍,但是要是直接把root用戶給了他們有點危險,于是只能給設(shè)權(quán)限,這篇文章主要給大家介紹了關(guān)于如何通過3個步驟為Mysql添加只讀賬號的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Mac上安裝Mysql的詳細(xì)步驟及配置

    Mac上安裝Mysql的詳細(xì)步驟及配置

    這篇文章主要給大家介紹了關(guān)于Mac上安裝Mysql的詳細(xì)步驟及配置,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-02-02
  • Innodb表select查詢順序

    Innodb表select查詢順序

    這篇文章主要介紹了Innodb表select查詢順序的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 登錄mysql數(shù)據(jù)庫的幾種方式

    登錄mysql數(shù)據(jù)庫的幾種方式

    本文主要介紹了登錄mysql數(shù)據(jù)庫的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • mysql聯(lián)合索引的使用規(guī)則

    mysql聯(lián)合索引的使用規(guī)則

    本文主要介紹了mysql聯(lián)合索引的具體使用,結(jié)合實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 解析mysql 緩存如何使用內(nèi)存

    解析mysql 緩存如何使用內(nèi)存

    本篇文章是對mysql中的緩存如何使用內(nèi)存進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySql獲取某個字段存在于哪個表的sql語句

    MySql獲取某個字段存在于哪個表的sql語句

    本文為大家詳細(xì)介紹下通過MySql查詢某個字段所在表是哪一個,具體的sql語句如下,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-07-07
  • 詳解mysql 中的鎖結(jié)構(gòu)

    詳解mysql 中的鎖結(jié)構(gòu)

    這篇文章主要介紹了mysql 中的鎖結(jié)構(gòu)的相關(guān)資料,幫助大家更好的理解和使用數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10

最新評論

周至县| 海城市| 彰化县| 罗甸县| 纳雍县| 江源县| 通州市| 阜新| 巴马| 武定县| 蒙城县| 靖安县| 正定县| 铁力市| 腾冲县| 乌鲁木齐市| 垦利县| 广灵县| 中牟县| 龙川县| 白朗县| 鄂尔多斯市| 双城市| 林甸县| 安福县| 平潭县| 云浮市| 绵竹市| 明溪县| 屏南县| 额济纳旗| 咸丰县| 兰州市| 繁峙县| 山阴县| 栾城县| 晋宁县| 沂源县| 鄂尔多斯市| 福清市| 永胜县|