日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
mysql怎么設(shè)置性能 mysql性能調(diào)優(yōu)與架構(gòu)設(shè)計

Linux上MySQL優(yōu)化提升性能,哪些可以優(yōu)化關(guān)閉NUMA特性?

Linux上MySQL優(yōu)化提升性能,可以優(yōu)化關(guān)閉NUMA特性如下:

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),克山企業(yè)網(wǎng)站建設(shè),克山品牌網(wǎng)站建設(shè),網(wǎng)站定制,克山網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,克山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

這些其實都源于CPU最新的技術(shù):節(jié)能模式。操作系統(tǒng)和CPU硬件配合,系統(tǒng)不繁忙的時候,為了節(jié)約電能和降低溫度,它會將CPU降頻。

為了保證MySQL能夠充分利用CPU的資源,建議設(shè)置CPU為最大性能模式。這個設(shè)置可以在BIOS和操作系統(tǒng)中設(shè)置,當(dāng)然,在BIOS中設(shè)置該選項更好,更徹底。

然后我們看看內(nèi)存方面,我們有哪些可以優(yōu)化的。

i)我們先看看numa

非一致存儲訪問結(jié)構(gòu)(NUMA:Non-UniformMemoryAccess)也是最新的內(nèi)存管理技術(shù)。它和對稱多處理器結(jié)構(gòu)(SMP:SymmetricMulti-Processor)是對應(yīng)的。

我們可以直觀的看到:SMP訪問內(nèi)存的都是代價都是一樣的;但是在NUMA架構(gòu)下,本地內(nèi)存的訪問和非本地內(nèi)存的訪問代價是不一樣的。對應(yīng)的根據(jù)這個特性,操作系統(tǒng)上,我們可以設(shè)置進(jìn)程的內(nèi)存分配方式。目前支持的方式包括:

--interleave=nodes

--membind=nodes

--cpunodebind=nodes

--physcpubind=cpus

--localalloc

--preferred=node

簡而言之,就是說,你可以指定內(nèi)存在本地分配,在某幾個CPU節(jié)點(diǎn)分配或者輪詢分配。除非是設(shè)置為--interleave=nodes輪詢分配方式,即內(nèi)存可以在任意NUMA節(jié)點(diǎn)上分配這種方式以外。其他的方式就算其他NUMA節(jié)點(diǎn)上還有內(nèi)存剩余,Linux也不會把剩余的內(nèi)存分配給這個進(jìn)程,而是采用SWAP的方式來獲得內(nèi)存。

所以最簡單的方法,還是關(guān)閉掉這個特性。

關(guān)閉特性的方法,分別有:可以從BIOS,操作系統(tǒng),啟動進(jìn)程時臨時關(guān)閉這個特性。

a)由于各種BIOS類型的區(qū)別,如何關(guān)閉NUMA千差萬別,我們這里就不具體展示怎么設(shè)置了。

b)在操作系統(tǒng)中關(guān)閉,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:

kernel/vmlinuz-2.6.32-220.el6.x86_64roroot=/dev/mapper/VolGroup-rootrd_NO_LUKS.UTF-8rd_LVM_LV=VolGroup/rootrd_NO_MDquietSYSFONT=latarcyrheb-sun16rhgbcrashkernel=autord_LVM_LV=VolGroup/swaprhgbcrashkernel=autoquietKEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMnuma=off

另外可以設(shè)置vm.zone_reclaim_mode=0盡量回收內(nèi)存。

c)啟動MySQL的時候,關(guān)閉NUMA特性:

numactl--interleave=allmysqld

當(dāng)然,最好的方式是在BIOS中關(guān)閉。

ii)我們再看看vm.swappiness。

vm.swappiness是操作系統(tǒng)控制物理內(nèi)存交換出去的策略。它允許的值是一個百分比的值,最小為0,最大運(yùn)行100,該值默認(rèn)為60。vm.swappiness設(shè)置為0表示盡量少swap,100表示盡量將inactive的內(nèi)存頁交換出去。

具體的說:當(dāng)內(nèi)存基本用滿的時候,系統(tǒng)會根據(jù)這個參數(shù)來判斷是把內(nèi)存中很少用到的inactive內(nèi)存交換出去,還是釋放數(shù)據(jù)的cache。

MySQL性能調(diào)優(yōu) – 你必須了解的15個重要變量

前言:

MYSQL 應(yīng)該是最流行了 WEB 后端數(shù)據(jù)庫。雖然 NOSQL 最近越來越多的被提到,但是相信大部分架構(gòu)師還是會選擇 MYSQL 來做數(shù)據(jù)存儲。本文作者總結(jié)梳理MySQL性能調(diào)優(yōu)的15個重要變量,又不足需要補(bǔ)充的還望大佬指出。

1.DEFAULT_STORAGE_ENGINE

如果你已經(jīng)在用MySQL 5.6或者5.7,并且你的數(shù)據(jù)表都是InnoDB,那么表示你已經(jīng)設(shè)置好了。如果沒有,確保把你的表轉(zhuǎn)換為InnoDB并且設(shè)置default_storage_engine為InnoDB。

為什么?簡而言之,因為InnoDB是MySQL(包括Percona Server和MariaDB)最好的存儲引擎 – 它支持事務(wù),高并發(fā),有著非常好的性能表現(xiàn)(當(dāng)配置正確時)。這里有詳細(xì)的版本介紹為什么

2.INNODB_BUFFER_POOL_SIZE

這個是InnoDB最重要變量。實際上,如果你的主要存儲引擎是InnoDB,那么對于你,這個變量對于MySQL是最重要的。

基本上,innodb_buffer_pool_size指定了MySQL應(yīng)該分配給InnoDB緩沖池多少內(nèi)存,InnoDB緩沖池用來存儲緩存的數(shù)據(jù),二級索引,臟數(shù)據(jù)(已經(jīng)被更改但沒有刷新到硬盤的數(shù)據(jù))以及各種內(nèi)部結(jié)構(gòu)如自適應(yīng)哈希索引。

根據(jù)經(jīng)驗,在一個獨(dú)立的MySQL服務(wù)器應(yīng)該分配給MySQL整個機(jī)器總內(nèi)存的80%。如果你的MySQL運(yùn)行在一個共享服務(wù)器,或者你想知道InnoDB緩沖池大小是否正確設(shè)置,詳細(xì)請看這里。

3.INNODB_LOG_FILE_SIZE

InnoDB重做日志文件的設(shè)置在MySQL社區(qū)也叫做事務(wù)日志。直到MySQL 5.6.8事務(wù)日志默認(rèn)值innodb_log_file_size=5M是唯一最大的InnoDB性能殺手。從MySQL 5.6.8開始,默認(rèn)值提升到48M,但對于許多稍繁忙的系統(tǒng),還遠(yuǎn)遠(yuǎn)要低。

根據(jù)經(jīng)驗,你應(yīng)該設(shè)置的日志大小能在你服務(wù)器繁忙時能存儲1-2小時的寫入量。如果不想這么麻煩,那么設(shè)置1-2G的大小會讓你的性能有一個不錯的表現(xiàn)。這個變量也相當(dāng)重要,更詳細(xì)的介紹請看這里。

當(dāng)然,如果你有大量的大事務(wù)更改,那么,更改比默認(rèn)innodb日志緩沖大小更大的值會對你的性能有一定的提高,但是你使用的是autocommit,或者你的事務(wù)更改小于幾k,那還是保持默認(rèn)的值吧。

4.INNODB_FLUSH_LOG_AT_TRX_COMMIT

默認(rèn)下,innodb_flush_log_at_trx_commit設(shè)置為1表示InnoDB在每次事務(wù)提交后立即刷新同步數(shù)據(jù)到硬盤。如果你使用autocommit,那么你的每一個INSERT, UPDATE或DELETE語句都是一個事務(wù)提交。

同步是一個昂貴的操作(特別是當(dāng)你沒有寫回緩存時),因為它涉及對硬盤的實際同步物理寫入。所以如果可能,并不建議使用默認(rèn)值。

兩個可選的值是0和2:

* 0表示刷新到硬盤,但不同步(提交事務(wù)時沒有實際的IO操作)

* 2表示不刷新和不同步(也沒有實際的IO操作)

所以你如果設(shè)置它為0或2,則同步操作每秒執(zhí)行一次。所以明顯的缺點(diǎn)是你可能會丟失上一秒的提交數(shù)據(jù)。具體來說,你的事務(wù)已經(jīng)提交了,但服務(wù)器馬上斷電了,那么你的提交相當(dāng)于沒有發(fā)生過。

顯示的,對于金融機(jī)構(gòu),如銀行,這是無法忍受的。不過對于大多數(shù)網(wǎng)站,可以設(shè)置為innodb_flush_log_at_trx_commit=0|2,即使服務(wù)器最終崩潰也沒有什么大問題。畢竟,僅僅在幾年前有許多網(wǎng)站還是用MyISAM,當(dāng)崩潰時會丟失30s的數(shù)據(jù)(更不要提那令人抓狂的慢修復(fù)進(jìn)程)。

那么,0和2之間的實際區(qū)別是什么?性能明顯的差異是可以忽略不計,因為刷新到操作系統(tǒng)緩存的操作是非常快的。所以很明顯應(yīng)該設(shè)置為0,萬一MySQL崩潰(不是整個機(jī)器),你不會丟失任何數(shù)據(jù),因為數(shù)據(jù)已經(jīng)在OS緩存,最終還是會同步到硬盤的。

5.SYNC_BINLOG

已經(jīng)有大量的文檔寫到sync_binlog,以及它和innodb_flush_log_at_trx_commit的關(guān)系,下面我們來簡單的介紹下:

a) 如果你的服務(wù)器沒有設(shè)置從服務(wù)器,而且你不做備份,那么設(shè)置sync_binlog=0將對性能有好處。

b) 如果你有從服務(wù)器并且做備份,但你不介意當(dāng)主服務(wù)器崩潰時在二進(jìn)制日志丟失一些事件,那么為了更好的性能還是設(shè)置為sync_binlog=0.

c) 如果你有從服務(wù)器并且備份,你非常在意從服務(wù)器的一致性,以及能及時恢復(fù)到一個時間點(diǎn)(通過使用最新的一致性備份和二進(jìn)制日志將數(shù)據(jù)庫恢復(fù)到特定時間點(diǎn)的能力),那么你應(yīng)該設(shè)置innodb_flush_log_at_trx_commit=1,并且需要認(rèn)真考慮使用sync_binlog=1。

問題是sync_binlog=1代價比較高 – 現(xiàn)在每個事務(wù)也要同步一次到硬盤。你可能會想為什么不把兩次同步合并成一次,想法正確 – 新版本的MySQL(5.6和5.7,MariaDB和Percona Server)已經(jīng)能合并提交,那么在這種情況下sync_binlog=1的操作也不是這么昂貴了,但在舊的mysql版本中仍然會對性能有很大影響。

6.INNODB_FLUSH_METHOD

將innodb_flush_method設(shè)置為O_DIRECT以避免雙重緩沖.唯一一種情況你不應(yīng)該使用O_DIRECT是當(dāng)你操作系統(tǒng)不支持時。但如果你運(yùn)行的是Linux,使用O_DIRECT來激活直接IO。

不用直接IO,雙重緩沖將會發(fā)生,因為所有的數(shù)據(jù)庫更改首先會寫入到OS緩存然后才同步到硬盤 – 所以InnoDB緩沖池和OS緩存會同時持有一份相同的數(shù)據(jù)。特別是如果你的緩沖池限制為總內(nèi)存的50%,那意味著在寫密集的環(huán)境中你可能會浪費(fèi)高達(dá)50%的內(nèi)存。如果沒有限制為50%,服務(wù)器可能由于OS緩存的高壓力會使用到swap。

簡單地說,設(shè)置為innodb_flush_method=O_DIRECT。

7.INNODB_BUFFER_POOL_INSTANCES

MySQL 5.5引入了緩沖實例作為減小內(nèi)部鎖爭用來提高M(jìn)ySQL吞吐量的手段。

在5.5版本這個對提升吞吐量幫助很小,然后在MySQL 5.6版本這個提升就非常大了,所以在MySQL5.5中你可能會保守地設(shè)置innodb_buffer_pool_instances=4,在MySQL 5.6和5.7中你可以設(shè)置為8-16個緩沖池實例。

你設(shè)置后觀察會覺得性能提高不大,但在大多數(shù)高負(fù)載情況下,它應(yīng)該會有不錯的表現(xiàn)。

對了,不要指望這個設(shè)置能減少你單個查詢的響應(yīng)時間。這個是在高并發(fā)負(fù)載的服務(wù)器上才看得出區(qū)別。比如多個線程同時做許多事情。

8.INNODB_THREAD_CONCURRENCY

InnoDB有一種方法來控制并行執(zhí)行的線程數(shù) – 我們稱為并發(fā)控制機(jī)制。大部分是由innodb_thread_concurrency值來控制的。如果設(shè)置為0,并發(fā)控制就關(guān)閉了,因此InnoDB會立即處理所有進(jìn)來的請求(盡可能多的)。

在你有32CPU核心且只有4個請求時會沒什么問題。不過想像下你只有4CPU核心和32個請求時 – 如果你讓32個請求同時處理,你這個自找麻煩。因為這些32個請求只有4 CPU核心,顯然地會比平常慢至少8倍(實際上是大于8倍),而然這些請求每個都有自己的外部和內(nèi)部鎖,這有很大可能堆積請求。

下面介紹如何更改這個變量,在mysql命令行提示符執(zhí)行:

對于大多數(shù)工作負(fù)載和服務(wù)器,設(shè)置為8是一個好開端,然后你可以根據(jù)服務(wù)器達(dá)到了這個限制而資源使用率利用不足時逐漸增加??梢酝ㄟ^show engine innodb status\G來查看目前查詢處理情況,查找類似如下行:

9.SKIP_NAME_RESOLVE

這一項不得不提及,因為仍然有很多人沒有添加這一項。你應(yīng)該添加skip_name_resolve來避免連接時DNS解析。

大多數(shù)情況下你更改這個會沒有什么感覺,因為大多數(shù)情況下DNS服務(wù)器解析會非???。不過當(dāng)DNS服務(wù)器失敗時,它會出現(xiàn)在你服務(wù)器上出現(xiàn)“unauthenticated connections” ,而就是為什么所有的請求都突然開始慢下來了。

所以不要等到這種事情發(fā)生才更改?,F(xiàn)在添加這個變量并且避免基于主機(jī)名的授權(quán)。

10.INNODB_IO_CAPACITY, INNODB_IO_CAPACITY_MAX

* innodb_io_capacity:用來當(dāng)刷新臟數(shù)據(jù)時,控制MySQL每秒執(zhí)行的寫IO量。

* innodb_io_capacity_max: 在壓力下,控制當(dāng)刷新臟數(shù)據(jù)時MySQL每秒執(zhí)行的寫IO量

首先,這與讀取無關(guān) – SELECT查詢執(zhí)行的操作。對于讀操作,MySQL會盡最大可能處理并返回結(jié)果。至于寫操作,MySQL在后臺會循環(huán)刷新,在每一個循環(huán)會檢查有多少數(shù)據(jù)需要刷新,并且不會用超過innodb_io_capacity指定的數(shù)來做刷新操作。這也包括更改緩沖區(qū)合并(在它們刷新到磁盤之前,更改緩沖區(qū)是輔助臟頁存儲的關(guān)鍵)。

第二,我需要解釋一下什么叫“在壓力下”,MySQL中稱為”緊急情況”,是當(dāng)MySQL在后臺刷新時,它需要刷新一些數(shù)據(jù)為了讓新的寫操作進(jìn)來。然后,MySQL會用到innodb_io_capacity_max。

那么,應(yīng)該設(shè)置innodb_io_capacity和innodb_io_capacity_max為什么呢?

最好的方法是測量你的存儲設(shè)置的隨機(jī)寫吞吐量,然后給innodb_io_capacity_max設(shè)置為你的設(shè)備能達(dá)到的最大IOPS。innodb_io_capacity就設(shè)置為它的50-75%,特別是你的系統(tǒng)主要是寫操作時。

通常你可以預(yù)測你的系統(tǒng)的IOPS是多少。例如由8 15k硬盤組成的RAID10能做大約每秒1000隨機(jī)寫操作,所以你可以設(shè)置innodb_io_capacity=600和innodb_io_capacity_max=1000。許多廉價企業(yè)SSD可以做4,000-10,000 IOPS等。

這個值設(shè)置得不完美問題不大。但是,要注意默認(rèn)的200和400會限制你的寫吞吐量,因此你可能偶爾會捕捉到刷新進(jìn)程。如果出現(xiàn)這種情況,可能是已經(jīng)達(dá)到你硬盤的寫IO吞吐量,或者這個值設(shè)置得太小限制了吞吐量。

11.INNODB_STATS_ON_METADATA

如果你跑的是MySQL 5.6或5.7,你不需要更改innodb_stats_on_metadata的默認(rèn)值,因為它已經(jīng)設(shè)置正確了。

不過在MySQL 5.5或5.1,強(qiáng)烈建議關(guān)閉這個變量 – 如果是開啟,像命令show table status會立即查詢INFORMATION_SCHEMA而不是等幾秒再執(zhí)行,這會使用到額外的IO操作。

從5.1.32版本開始,這個是動態(tài)變量,意味著你不需要重啟MySQL服務(wù)器來關(guān)閉它。

12.INNODB_BUFFER_POOL_DUMP_AT_SHUTDOWN INNODB_BUFFER_POOL_LOAD_AT_STARTUP

innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup這兩個變量與性能無關(guān),不過如果你偶爾重啟mysql服務(wù)器(如生效配置),那么就有關(guān)。當(dāng)兩個都激活時,MySQL緩沖池的內(nèi)容(更具體地說,是緩存頁)在停止MySQL時存儲到一個文件。當(dāng)你下次啟動MySQL時,它會在后臺啟動一個線程來加載緩沖池的內(nèi)容以提高預(yù)熱速度到3-5倍。

兩件事:

第一,它實際上沒有在關(guān)閉時復(fù)制緩沖池內(nèi)容到文件,僅僅是復(fù)制表空間ID和頁面ID – 足夠的信息來定位硬盤上的頁面了。然后它就能以大量的順序讀非??焖俚募虞d那些頁面,而不是需要成千上萬的小隨機(jī)讀。

第二,啟動時是在后臺加載內(nèi)容,因為MySQL不需要等到緩沖池內(nèi)容加載完成再開始接受請求(所以看起來不會有什么影響)。

從MySQL 5.7.7開始,默認(rèn)只有25%的緩沖池頁面在mysql關(guān)閉時存儲到文件,但是你可以控制這個值 – 使用innodb_buffer_pool_dump_pct,建議75-100。

這個特性從MySQL 5.6才開始支持。

13.INNODB_ADAPTIVE_HASH_INDEX_PARTS

如果你運(yùn)行著一個大量SELECT查詢的MySQL服務(wù)器(并且已經(jīng)盡可能優(yōu)化),那么自適應(yīng)哈希索引將下你的下一個瓶頸。自適應(yīng)哈希索引是InnoDB內(nèi)部維護(hù)的動態(tài)索引,可以提高最常用的查詢模式的性能。這個特性可以重啟服務(wù)器關(guān)閉,不過默認(rèn)下在mysql的所有版本開啟。

這個技術(shù)非常復(fù)雜,在大多數(shù)情況下它會對大多數(shù)類型的查詢直到加速的作用。不過,當(dāng)你有太多的查詢往數(shù)據(jù)庫,在某一個點(diǎn)上它會花過多的時間等待AHI鎖和閂鎖。

如果你的是MySQL 5.7,沒有這個問題 – innodb_adaptive_hash_index_parts默認(rèn)設(shè)置為8,所以自適應(yīng)哈希索引被切割為8個分區(qū),因為不存在全局互斥。

不過在mysql 5.7前的版本,沒有AHI分區(qū)數(shù)量的控制。換句話說,有一個全局互斥鎖來保護(hù)AHI,可能導(dǎo)致你的select查詢經(jīng)常撞墻。

所以如果你運(yùn)行的是5.1或5.6,并且有大量的select查詢,最簡單的方案就是切換成同一版本的Percona Server來激活A(yù)HI分區(qū)。

14.QUERY_CACHE_TYPE

如果人認(rèn)為查詢緩存效果很好,肯定應(yīng)該使用它。好吧,有時候是有用的。不過這個只在你在低負(fù)載時有用,特別是在低負(fù)載下大多數(shù)是讀取,小量寫或者沒有。

如果是那樣的情況,設(shè)置query_cache_type=ON和query_cache_size=256M就好了。不過記住不能把256M設(shè)置更高的值了,否則會由于查詢緩存失效時,導(dǎo)致引起嚴(yán)重的服務(wù)器停頓。

如果你的MySQL服務(wù)器高負(fù)載動作,建議設(shè)置query_cache_size=0和query_cache_type=OFF,并重啟服務(wù)器生效。那樣Mysql就會停止在所有的查詢使用查詢緩存互斥鎖。

15.TABLE_OPEN_CACHE_INSTANCES

從MySQL 5.6.6開始,表緩存能分割到多個分區(qū)。

表緩存用來存放目前已打開表的列表,當(dāng)每一個表打開或關(guān)閉互斥體就被鎖定 – 即使這是一個隱式臨時表。使用多個分區(qū)絕對減少了潛在的爭用。

從MySQL 5.7.8開始,table_open_cache_instances=16是默認(rèn)的配置。

歡迎做Java的工程師朋友們私信我資料免費(fèi)獲取免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點(diǎn)的架構(gòu)資料)

其中覆蓋了互聯(lián)網(wǎng)的方方面面,期間碰到各種產(chǎn)品各種場景下的各種問題,很值得大家借鑒和學(xué)習(xí),擴(kuò)展自己的技術(shù)廣度和知識面。

如何設(shè)置合理的mysql的參數(shù)?

[client]\x0d\x0aport = 3306\x0d\x0asocket = /tmp/mysql.sock\x0d\x0a[mysqld]\x0d\x0aport = 3306\x0d\x0asocket = /tmp/mysql.sock\x0d\x0a\x0d\x0abasedir = /usr/local/mysql\x0d\x0adatadir = /data/mysql\x0d\x0apid-file = /data/mysql/mysql.pid\x0d\x0auser = mysql\x0d\x0abind-address = 0.0.0.0\x0d\x0aserver-id = 1 #表示是本機(jī)的序號為1,一般來講就是master的意思\x0d\x0a\x0d\x0askip-name-resolve\x0d\x0a# 禁止MySQL對外部連接進(jìn)行DNS解析,使用這一選項可以消除MySQL進(jìn)行DNS解析的時間。但需要注意,如果開啟該選項,\x0d\x0a# 則所有遠(yuǎn)程主機(jī)連接授權(quán)都要使用IP地址方式,否則MySQL將無法正常處理連接請求\x0d\x0a\x0d\x0a#skip-networking\x0d\x0a\x0d\x0aback_log = 600\x0d\x0a# MySQL能有的連接數(shù)量。當(dāng)主要MySQL線程在一個很短時間內(nèi)得到非常多的連接請求,這就起作用,\x0d\x0a# 然后主線程花些時間(盡管很短)檢查連接并且啟動一個新線程。back_log值指出在MySQL暫時停止回答新請求之前的短時間內(nèi)多少個請求可以被存在堆棧中。\x0d\x0a# 如果期望在一個短時間內(nèi)有很多連接,你需要增加它。也就是說,如果MySQL的連接數(shù)據(jù)達(dá)到max_connections時,新來的請求將會被存在堆棧中,\x0d\x0a# 以等待某一連接釋放資源,該堆棧的數(shù)量即back_log,如果等待連接的數(shù)量超過back_log,將不被授予連接資源。\x0d\x0a# 另外,這值(back_log)限于您的操作系統(tǒng)對到來的TCP/IP連接的偵聽隊列的大小。\x0d\x0a# 你的操作系統(tǒng)在這個隊列大小上有它自己的限制(可以檢查你的OS文檔找出這個變量的最大值),試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無效的。\x0d\x0a\x0d\x0amax_connections = 1000\x0d\x0a# \x0d\x0aMySQL的最大連接數(shù),如果服務(wù)器的并發(fā)連接請求量比較大,建議調(diào)高此值,以增加并行連接數(shù)量,當(dāng)然這建立在機(jī)器能支撐的情況下,因為如果連接數(shù)越多,\x0d\x0a介于MySQL會為每個連接提供連接緩沖區(qū),就會開銷越多的內(nèi)存,所以要適當(dāng)調(diào)整該值,不能盲目提高設(shè)值??梢赃^'conn%'通配符查看當(dāng)前狀態(tài)的連接\x0d\x0a數(shù)量,以定奪該值的大小。\x0d\x0a\x0d\x0amax_connect_errors = 6000\x0d\x0a# 對于同一主機(jī),如果有超出該參數(shù)值個數(shù)的中斷錯誤連接,則該主機(jī)將被禁止連接。如需對該主機(jī)進(jìn)行解禁,執(zhí)行:FLUSH HOST。\x0d\x0a\x0d\x0aopen_files_limit = 65535\x0d\x0a# MySQL打開的文件描述符限制,默認(rèn)最小1024;當(dāng)open_files_limit沒有被配置的時候,比較max_connections*5和ulimit -n的值,哪個大用哪個,\x0d\x0a# 當(dāng)open_file_limit被配置的時候,比較open_files_limit和max_connections*5的值,哪個大用哪個。\x0d\x0a\x0d\x0atable_open_cache = 128\x0d\x0a# MySQL每打開一個表,都會讀入一些數(shù)據(jù)到table_open_cache緩存中,當(dāng)MySQL在這個緩存中找不到相應(yīng)信息時,才會去磁盤上讀取。默認(rèn)值64\x0d\x0a# 假定系統(tǒng)有200個并發(fā)連接,則需將此參數(shù)設(shè)置為200*N(N為每個連接所需的文件描述符數(shù)目);\x0d\x0a# 當(dāng)把table_open_cache設(shè)置為很大時,如果系統(tǒng)處理不了那么多文件描述符,那么就會出現(xiàn)客戶端失效,連接不上\x0d\x0a\x0d\x0amax_allowed_packet = 4M\x0d\x0a# 接受的數(shù)據(jù)包大小;增加該變量的值十分安全,這是因為僅當(dāng)需要時才會分配額外內(nèi)存。例如,僅當(dāng)你發(fā)出長查詢或MySQLd必須返回大的結(jié)果行時MySQLd才會分配更多內(nèi)存。\x0d\x0a# 該變量之所以取較小默認(rèn)值是一種預(yù)防措施,以捕獲客戶端和服務(wù)器之間的錯誤信息包,并確保不會因偶然使用大的信息包而導(dǎo)致內(nèi)存溢出。\x0d\x0a\x0d\x0abinlog_cache_size = 1M\x0d\x0a# 一個事務(wù),在沒有提交的時候,產(chǎn)生的日志,記錄到Cache中;等到事務(wù)提交需要提交的時候,則把日志持久化到磁盤。默認(rèn)binlog_cache_size大小32K\x0d\x0a\x0d\x0amax_heap_table_size = 8M\x0d\x0a# 定義了用戶可以創(chuàng)建的內(nèi)存表(memory table)的大小。這個值用來計算內(nèi)存表的最大行數(shù)值。這個變量支持動態(tài)改變\x0d\x0a\x0d\x0atmp_table_size = 16M\x0d\x0a# MySQL的heap(堆積)表緩沖大小。所有聯(lián)合在一個DML指令內(nèi)完成,并且大多數(shù)聯(lián)合甚至可以不用臨時表即可以完成。\x0d\x0a# 大多數(shù)臨時表是基于內(nèi)存的(HEAP)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含BLOB列的表存儲在硬盤上。\x0d\x0a#\x0d\x0a \x0d\x0a如果某個內(nèi)部heap(堆積)表大小超過tmp_table_size,MySQL可以根據(jù)需要自動將內(nèi)存中的heap表改為基于硬盤的MyISAM表。\x0d\x0a還可以通過設(shè)置tmp_table_size選項來增加臨時表的大小。也就是說,如果調(diào)高該值,MySQL同時將增加heap表的大小,可達(dá)到提高聯(lián)接查\x0d\x0a詢速度的效果\x0d\x0a\x0d\x0aread_buffer_size = 2M\x0d\x0a# MySQL讀入緩沖區(qū)大小。對表進(jìn)行順序掃描的請求將分配一個讀入緩沖區(qū),MySQL會為它分配一段內(nèi)存緩沖區(qū)。read_buffer_size變量控制這一緩沖區(qū)的大小。\x0d\x0a# 如果對表的順序掃描請求非常頻繁,并且你認(rèn)為頻繁掃描進(jìn)行得太慢,可以通過增加該變量值以及內(nèi)存緩沖區(qū)大小提高其性能\x0d\x0a\x0d\x0aread_rnd_buffer_size = 8M\x0d\x0a# MySQL的隨機(jī)讀緩沖區(qū)大小。當(dāng)按任意順序讀取行時(例如,按照排序順序),將分配一個隨機(jī)讀緩存區(qū)。進(jìn)行排序查詢時,\x0d\x0a# MySQL會首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數(shù)據(jù),可適當(dāng)調(diào)高該值。但MySQL會為每個客戶連接發(fā)放該緩沖空間,所以應(yīng)盡量適當(dāng)設(shè)置該值,以避免內(nèi)存開銷過大\x0d\x0a\x0d\x0asort_buffer_size = 8M\x0d\x0a# MySQL執(zhí)行排序使用的緩沖大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。\x0d\x0a# 如果不能,可以嘗試增加sort_buffer_size變量的大小\x0d\x0a\x0d\x0ajoin_buffer_size = 8M\x0d\x0a# 聯(lián)合查詢操作所能使用的緩沖區(qū)大小,和sort_buffer_size一樣,該參數(shù)對應(yīng)的分配內(nèi)存也是每連接獨(dú)享\x0d\x0a\x0d\x0athread_cache_size = 8\x0d\x0a# 這個值(默認(rèn)8)表示可以重新利用保存在緩存中線程的數(shù)量,當(dāng)斷開連接時如果緩存中還有空間,那么客戶端的線程將被放到緩存中,\x0d\x0a# 如果線程重新被請求,那么請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那么這個線程將被重新創(chuàng)建,如果有很多新的線程,\x0d\x0a# 增加這個值可以改善系統(tǒng)性能.通過比較Connections和Threads_created狀態(tài)的變量,可以看到這個變量的作用。(_表示要調(diào)整的值)\x0d\x0a# 根據(jù)物理內(nèi)存設(shè)置規(guī)則如下:\x0d\x0a# 1G — 8\x0d\x0a# 2G — 16\x0d\x0a# 3G — 32\x0d\x0a# 大于3G — 64\x0d\x0a\x0d\x0aquery_cache_size = 8M\x0d\x0a#MySQL的查詢緩沖大?。◤?.0.1開始,MySQL提供了查詢緩沖機(jī)制)使用查詢緩沖,MySQL將SELECT語句和查詢結(jié)果存放在緩沖區(qū)中,\x0d\x0a# 今后對于同樣的SELECT語句(區(qū)分大小寫),將直接從緩沖區(qū)中讀取結(jié)果。根據(jù)MySQL用戶手冊,使用查詢緩沖最多可以達(dá)到238%的效率。\x0d\x0a# 通過檢查狀態(tài)值'Qcache_%',可以知道query_cache_size設(shè)置是否合理:如果Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況,\x0d\x0a# 如果Qcache_hits的值也非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大??;如果Qcache_hits的值不大,則表明你的查詢重復(fù)率很低,\x0d\x0a# 這種情況下使用查詢緩沖反而會影響效率,那么可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖\x0d\x0a\x0d\x0aquery_cache_limit = 2M\x0d\x0a#指定單個查詢能夠使用的緩沖區(qū)大小,默認(rèn)1M\x0d\x0a\x0d\x0akey_buffer_size = 4M\x0d\x0a#指定用于索引的緩沖區(qū)大小,增加它可得到更好處理的索引(對所有讀和多重寫),到你能負(fù)擔(dān)得起那樣多。如果你使它太大,\x0d\x0a# 系統(tǒng)將開始換頁并且真的變慢了。對于內(nèi)存在4GB左右的服務(wù)器該參數(shù)可設(shè)置為384M或512M。通過檢查狀態(tài)值Key_read_requests和Key_reads,\x0d\x0a# 可以知道key_buffer_size設(shè)置是否合理。比例key_reads/key_read_requests應(yīng)該盡可能的低,\x0d\x0a# 至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE 'key_read%'獲得)。注意:該參數(shù)值設(shè)置的過大反而會是服務(wù)器整體效率降低\x0d\x0a\x0d\x0aft_min_word_len = 4\x0d\x0a# 分詞詞匯最小長度,默認(rèn)4\x0d\x0a\x0d\x0atransaction_isolation = REPEATABLE-READ\x0d\x0a# MySQL支持4種事務(wù)隔離級別,他們分別是:\x0d\x0a# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.\x0d\x0a# 如沒有指定,MySQL默認(rèn)采用的是REPEATABLE-READ,ORACLE默認(rèn)的是READ-COMMITTED\x0d\x0a\x0d\x0alog_bin = mysql-bin\x0d\x0abinlog_format = mixed\x0d\x0aexpire_logs_days = 30 #超過30天的binlog刪除\x0d\x0a\x0d\x0alog_error = /data/mysql/mysql-error.log #錯誤日志路徑\x0d\x0aslow_query_log = 1\x0d\x0along_query_time = 1 #慢查詢時間 超過1秒則為慢查詢\x0d\x0aslow_query_log_file = /data/mysql/mysql-slow.log\x0d\x0a\x0d\x0aperformance_schema = 0\x0d\x0aexplicit_defaults_for_timestamp\x0d\x0a\x0d\x0a#lower_case_table_names = 1 #不區(qū)分大小寫\x0d\x0a\x0d\x0askip-external-locking #MySQL選項以避免外部鎖定。該選項默認(rèn)開啟\x0d\x0a\x0d\x0adefault-storage-engine = InnoDB #默認(rèn)存儲引擎\x0d\x0a\x0d\x0ainnodb_file_per_table = 1\x0d\x0a# InnoDB為獨(dú)立表空間模式,每個數(shù)據(jù)庫的每個表都會生成一個數(shù)據(jù)空間\x0d\x0a# 獨(dú)立表空間優(yōu)點(diǎn):\x0d\x0a# 1.每個表都有自已獨(dú)立的表空間。\x0d\x0a# 2.每個表的數(shù)據(jù)和索引都會存在自已的表空間中。\x0d\x0a# 3.可以實現(xiàn)單表在不同的數(shù)據(jù)庫中移動。\x0d\x0a# 4.空間可以回收(除drop table操作處,表空不能自已回收)\x0d\x0a# 缺點(diǎn):\x0d\x0a# 單表增加過大,如超過100G\x0d\x0a# 結(jié)論:\x0d\x0a# 共享表空間在Insert操作上少有優(yōu)勢。其它都沒獨(dú)立表空間表現(xiàn)好。當(dāng)啟用獨(dú)立表空間時,請合理調(diào)整:innodb_open_files\x0d\x0a\x0d\x0ainnodb_open_files = 500\x0d\x0a# 限制Innodb能打開的表的數(shù)據(jù),如果庫里的表特別多的情況,請增加這個。這個值默認(rèn)是300\x0d\x0a\x0d\x0ainnodb_buffer_pool_size = 64M\x0d\x0a# InnoDB使用一個緩沖池來保存索引和原始數(shù)據(jù), 不像MyISAM.\x0d\x0a# 這里你設(shè)置越大,你在存取表里面數(shù)據(jù)時所需要的磁盤I/O越少.\x0d\x0a# 在一個獨(dú)立使用的數(shù)據(jù)庫服務(wù)器上,你可以設(shè)置這個變量到服務(wù)器物理內(nèi)存大小的80%\x0d\x0a# 不要設(shè)置過大,否則,由于物理內(nèi)存的競爭可能導(dǎo)致操作系統(tǒng)的換頁顛簸.\x0d\x0a# 注意在32位系統(tǒng)上你每個進(jìn)程可能被限制在 2-3.5G 用戶層面內(nèi)存限制,\x0d\x0a# 所以不要設(shè)置的太高.\x0d\x0a\x0d\x0ainnodb_write_io_threads = 4\x0d\x0ainnodb_read_io_threads = 4\x0d\x0a# innodb使用后臺線程處理數(shù)據(jù)頁上的讀寫 I/O(輸入輸出)請求,根據(jù)你的 CPU 核數(shù)來更改,默認(rèn)是4\x0d\x0a# 注:這兩個參數(shù)不支持動態(tài)改變,需要把該參數(shù)加入到my.cnf里,修改完后重啟MySQL服務(wù),允許值的范圍從 1-64\x0d\x0a\x0d\x0ainnodb_thread_concurrency = 0\x0d\x0a# 默認(rèn)設(shè)置為 0,表示不限制并發(fā)數(shù),這里推薦設(shè)置為0,更好去發(fā)揮CPU多核處理能力,提高并發(fā)量\x0d\x0a\x0d\x0ainnodb_purge_threads = 1\x0d\x0a# InnoDB中的清除操作是一類定期回收無用數(shù)據(jù)的操作。在之前的幾個版本中,清除操作是主線程的一部分,這意味著運(yùn)行時它可能會堵塞其它的數(shù)據(jù)庫操作。\x0d\x0a# 從MySQL5.5.X版本開始,該操作運(yùn)行于獨(dú)立的線程中,并支持更多的并發(fā)數(shù)。用戶可通過設(shè)置innodb_purge_threads配置參數(shù)來選擇清除操作是否使用單\x0d\x0a# 獨(dú)線程,默認(rèn)情況下參數(shù)設(shè)置為0(不使用單獨(dú)線程),設(shè)置為 1 時表示使用單獨(dú)的清除線程。建議為1\x0d\x0a\x0d\x0ainnodb_flush_log_at_trx_commit = 2\x0d\x0a# 0:如果innodb_flush_log_at_trx_commit的值為0,log buffer每秒就會被刷寫日志文件到磁盤,提交事務(wù)的時候不做任何操作(執(zhí)行是由mysql的master thread線程來執(zhí)行的。\x0d\x0a# 主線程中每秒會將重做日志緩沖寫入磁盤的重做日志文件(REDO LOG)中。不論事務(wù)是否已經(jīng)提交)默認(rèn)的日志文件是ib_logfile0,ib_logfile1\x0d\x0a# 1:當(dāng)設(shè)為默認(rèn)值1的時候,每次提交事務(wù)的時候,都會將log buffer刷寫到日志。\x0d\x0a# 2:如果設(shè)為2,每次提交事務(wù)都會寫日志,但并不會執(zhí)行刷的操作。每秒定時會刷到日志文件。要注意的是,并不能保證100%每秒一定都會刷到磁盤,這要取決于進(jìn)程的調(diào)度。\x0d\x0a# 每次事務(wù)提交的時候?qū)?shù)據(jù)寫入事務(wù)日志,而這里的寫入僅是調(diào)用了文件系統(tǒng)的寫入操作,而文件系統(tǒng)是有 緩存的,所以這個寫入并不能保證數(shù)據(jù)已經(jīng)寫入到物理磁盤\x0d\x0a# 默認(rèn)值1是為了保證完整的ACID。當(dāng)然,你可以將這個配置項設(shè)為1以外的值來換取更高的性能,但是在系統(tǒng)崩潰的時候,你將會丟失1秒的數(shù)據(jù)。\x0d\x0a# 設(shè)為0的話,mysqld進(jìn)程崩潰的時候,就會丟失最后1秒的事務(wù)。設(shè)為2,只有在操作系統(tǒng)崩潰或者斷電的時候才會丟失最后1秒的數(shù)據(jù)。InnoDB在做恢復(fù)的時候會忽略這個值。\x0d\x0a# 總結(jié)\x0d\x0a# 設(shè)為1當(dāng)然是最安全的,但性能頁是最差的(相對其他兩個參數(shù)而言,但不是不能接受)。如果對數(shù)據(jù)一致性和完整性要求不高,完全可以設(shè)為2,如果只最求性能,例如高并發(fā)寫的日志服務(wù)器,設(shè)為0來獲得更高性能\x0d\x0a\x0d\x0ainnodb_log_buffer_size = 2M\x0d\x0a# 此參數(shù)確定些日志文件所用的內(nèi)存大小,以M為單位。緩沖區(qū)更大能提高性能,但意外的故障將會丟失數(shù)據(jù)。MySQL開發(fā)人員建議設(shè)置為1-8M之間\x0d\x0a\x0d\x0ainnodb_log_file_size = 32M\x0d\x0a# 此參數(shù)確定數(shù)據(jù)日志文件的大小,更大的設(shè)置可以提高性能,但也會增加恢復(fù)故障數(shù)據(jù)庫所需的時間\x0d\x0a\x0d\x0ainnodb_log_files_in_group = 3\x0d\x0a# 為提高性能,MySQL可以以循環(huán)方式將日志文件寫到多個文件。推薦設(shè)置為3\x0d\x0a\x0d\x0ainnodb_max_dirty_pages_pct = 90\x0d\x0a# innodb主線程刷新緩存池中的數(shù)據(jù),使臟數(shù)據(jù)比例小于90%\x0d\x0a\x0d\x0ainnodb_lock_wait_timeout = 120 \x0d\x0a# InnoDB事務(wù)在被回滾之前可以等待一個鎖定的超時秒數(shù)。InnoDB在它自己的鎖定表中自動檢測事務(wù)死鎖并且回滾事務(wù)。InnoDB用LOCK TABLES語句注意到鎖定設(shè)置。默認(rèn)值是50秒\x0d\x0a\x0d\x0abulk_insert_buffer_size = 8M\x0d\x0a# 批量插入緩存大小, 這個參數(shù)是針對MyISAM存儲引擎來說的。適用于在一次性插入100-1000+條記錄時, 提高效率。默認(rèn)值是8M??梢葬槍?shù)據(jù)量的大小,翻倍增加。\x0d\x0a\x0d\x0amyisam_sort_buffer_size = 8M\x0d\x0a# MyISAM設(shè)置恢復(fù)表之時使用的緩沖區(qū)的尺寸,當(dāng)在REPAIR TABLE或用CREATE INDEX創(chuàng)建索引或ALTER TABLE過程中排序 MyISAM索引分配的緩沖區(qū)\x0d\x0a\x0d\x0amyisam_max_sort_file_size = 10G\x0d\x0a# 如果臨時文件會變得超過索引,不要使用快速排序索引方法來創(chuàng)建一個索引。注釋:這個參數(shù)以字節(jié)的形式給出\x0d\x0a\x0d\x0amyisam_repair_threads = 1\x0d\x0a# 如果該值大于1,在Repair by sorting過程中并行創(chuàng)建MyISAM表索引(每個索引在自己的線程內(nèi)) \x0d\x0a\x0d\x0ainteractive_timeout = 28800\x0d\x0a# 服務(wù)器關(guān)閉交互式連接前等待活動的秒數(shù)。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。默認(rèn)值:28800秒(8小時)\x0d\x0a\x0d\x0await_timeout = 28800\x0d\x0a# 服務(wù)器關(guān)閉非交互連接之前等待活動的秒數(shù)。在線程啟動時,根據(jù)全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,\x0d\x0a# 取決于客戶端類型(由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義)。參數(shù)默認(rèn)值:28800秒(8小時)\x0d\x0a# MySQL服務(wù)器所支持的最大連接數(shù)是有上限的,因為每個連接的建立都會消耗內(nèi)存,因此我們希望客戶端在連接到MySQL Server處理完相應(yīng)的操作后,\x0d\x0a# 應(yīng)該斷開連接并釋放占用的內(nèi)存。如果你的MySQL Server有大量的閑置連接,他們不僅會白白消耗內(nèi)存,而且如果連接一直在累加而不斷開,\x0d\x0a# 最終肯定會達(dá)到MySQL Server的連接上限數(shù),這會報'too many connections'的錯誤。對于wait_timeout的值設(shè)定,應(yīng)該根據(jù)系統(tǒng)的運(yùn)行情況來判斷。\x0d\x0a# 在系統(tǒng)運(yùn)行一段時間后,可以通過show processlist命令查看當(dāng)前系統(tǒng)的連接狀態(tài),如果發(fā)現(xiàn)有大量的sleep狀態(tài)的連接進(jìn)程,則說明該參數(shù)設(shè)置的過大,\x0d\x0a# 可以進(jìn)行適當(dāng)?shù)恼{(diào)整小些。要同時設(shè)置interactive_timeout和wait_timeout才會生效。\x0d\x0a\x0d\x0a[mysqldump]\x0d\x0aquick\x0d\x0amax_allowed_packet = 16M #服務(wù)器發(fā)送和接受的最大包長度\x0d\x0a[myisamchk]\x0d\x0akey_buffer_size = 8M\x0d\x0asort_buffer_size = 8M\x0d\x0aread_buffer = 4M\x0d\x0awrite_buffer = 4M


名稱欄目:mysql怎么設(shè)置性能 mysql性能調(diào)優(yōu)與架構(gòu)設(shè)計
當(dāng)前路徑:http://www.dlmjj.cn/article/dojopdp.html