mysql調(diào)優(yōu)

MYSQL 應(yīng)該是最流行了 WEB 后端數(shù)據(jù)庫。WEB 開發(fā)語言最近發(fā)展很快,PHP, Ruby, Python, Java 各有特點(diǎn),雖然 NOSQL 最近越來越多的被提到,但是相信大部分架構(gòu)師還是會(huì)選擇 MYSQL 來做數(shù)據(jù)存儲(chǔ)。

MYSQL 如此方便和穩(wěn)定,以至于我們?cè)陂_發(fā) WEB 程序的時(shí)候很少想到它。即使想到優(yōu)化也是程序級(jí)別的,比如,不要寫過于消耗資源的 SQL 語句。但是除此之外,在整個(gè)系統(tǒng)上仍然有很多可以優(yōu)化的地方。

Mysql 全局修改參數(shù)的命令:set global + 參數(shù)
Mysql 查詢一個(gè)參數(shù)的命令:show variables like + 參數(shù)

一、mysql非緩存參數(shù)設(shè)置及介紹:

1. back_log:由默認(rèn)的修改為 系統(tǒng)內(nèi)核 tcp/ip 連接數(shù)的一半。(每個(gè)back_log 鏈接占用256kb資源。)

back_log值指出在MySQL暫時(shí)停止回答新請(qǐng)求之前的短時(shí)間內(nèi)多少個(gè)請(qǐng)求可以被存在堆棧中。也就是說,如果MySql的連接數(shù)據(jù)達(dá)到max_connections時(shí),新來的請(qǐng)求將會(huì)被存在堆棧中,以等待某一連接釋放資源,該堆棧的數(shù)量即back_log,如果等待連接的數(shù)量超過back_log,將不被授予連接資源。將會(huì)報(bào):unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進(jìn)程時(shí).
back_log值不能超過TCP/IP連接的偵聽隊(duì)列的大小。若超過則無效,查看當(dāng)前系統(tǒng)的TCP/IP連接的偵聽隊(duì)列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog目前系統(tǒng)為1024。對(duì)于Linux系統(tǒng)推薦設(shè)置為小于512的整數(shù)。
修改系統(tǒng)內(nèi)核參數(shù),)
查看mysql 當(dāng)前系統(tǒng)默認(rèn)back_log值,命令:

查看當(dāng)前數(shù)量:
show variables like 'back_log';

2. wait_timeout:MySQL客戶端的數(shù)據(jù)庫連接閑置最大時(shí)間值。wait_timeout=1800

說得比較通俗一點(diǎn),就是當(dāng)你的MySQL連接閑置超過一定時(shí)間后將會(huì)被強(qiáng)行關(guān)閉。MySQL默認(rèn)的wait-timeout 值為8個(gè)小時(shí),可以通過命令

查看結(jié)果值:
show variables like 'wait_timeout';

設(shè)置這個(gè)值是非常有意義的,比如你的網(wǎng)站有大量的MySQL鏈接請(qǐng)求(每個(gè)MySQL連接都是要內(nèi)存資源開銷的 ),由于你的程序的原因有大量的連接請(qǐng)求空閑啥事也不干,白白占用內(nèi)存資源,或者導(dǎo)致MySQL超過最大連接數(shù)從來無法新建連接導(dǎo)致“Too many connections”的錯(cuò)誤。在設(shè)置之前你可以查看一下你的MYSQL的狀態(tài)(可用show processlist),如果經(jīng)常發(fā)現(xiàn)MYSQL中有大量的Sleep進(jìn)程,則需要 修改wait-timeout值了。
1.interactive_timeout:服務(wù)器關(guān)閉交互式連接前等待活動(dòng)的秒數(shù)。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項(xiàng)的客戶端。
2.wait_timeout:服務(wù)器關(guān)閉非交互連接之前等待活動(dòng)的秒數(shù)。在線程啟動(dòng)時(shí),根據(jù)全局wait_timeout值或全局 interactive_timeout值初始化會(huì)話wait_timeout值,取決于客戶端類型(由mysql_real_connect()的連接選項(xiàng)CLIENT_INTERACTIVE定義).
這兩個(gè)參數(shù)必須配合使用。否則單獨(dú)設(shè)置wait_timeout無效

3. max_connections:mysql 最大連接數(shù)設(shè)置(根據(jù)服務(wù)器系統(tǒng)設(shè)置)

max_connections是指MySql的最大連接數(shù),如果服務(wù)器的并發(fā)連接請(qǐng)求量比較大,建議調(diào)高此值,以增加并行連接數(shù)量,當(dāng)然這建立在機(jī)器能支撐的情況下,因?yàn)槿绻B接數(shù)越多,介于MySql會(huì)為每個(gè)連接提供連接緩沖區(qū),就會(huì)開銷越多的內(nèi)存,所以要適當(dāng)調(diào)整該值,不能盲目提高設(shè)值??梢赃^'conn%'通配符查看當(dāng)前狀態(tài)的連接數(shù)量,以定奪該值的大小。
MySQL服務(wù)器允許的最大連接數(shù)16384;

查看系統(tǒng)當(dāng)前最大連接數(shù):
show variables like 'max_connections';

4. max_user_connections:

max_user_connections是指每個(gè)數(shù)據(jù)庫用戶的最大連接
針對(duì)某一個(gè)賬號(hào)的所有客戶端并行連接到MYSQL服務(wù)的最大并行連接數(shù)。簡單說是指同一個(gè)賬號(hào)能夠同時(shí)連接到mysql服務(wù)的最大連接數(shù)。設(shè)置為0表示不限制。
目前默認(rèn)值為:0不受限制。
這兒順便介紹下Max_used_connections:它是指從這次mysql服務(wù)啟動(dòng)到現(xiàn)在,同一時(shí)刻并行連接數(shù)的最大值。它不是指當(dāng)前的連接情況,而是一個(gè)比較值。如果在過去某一個(gè)時(shí)刻,MYSQL服務(wù)同時(shí)有1000個(gè)請(qǐng)求連接過來,而之后再也沒有出現(xiàn)這么大的并發(fā)請(qǐng)求時(shí),則Max_used_connections=1000.請(qǐng)注意與show variables 里的max_user_connections的區(qū)別。默認(rèn)為0表示無限大。

查看max_user_connections值:
show variables like 'max_user_connections';

5. thread_concurrency:設(shè)置成cpu個(gè)數(shù)的2倍。

thread_concurrency的值的正確與否, 對(duì)mysql的性能影響很大, 在多個(gè)cpu(或多核)的情況下,錯(cuò)誤設(shè)置了thread_concurrency的值, 會(huì)導(dǎo)致mysql不能充分利用多cpu(或多核), 出現(xiàn)同一時(shí)刻只能一個(gè)cpu(或核)在工作的情況。
thread_concurrency應(yīng)設(shè)為CPU核數(shù)的2倍. 比如有一個(gè)雙核的CPU, 那thread_concurrency 的應(yīng)該為4; 2個(gè)雙核的cpu, thread_concurrency的值應(yīng)為8.
比如:根據(jù)上面介紹我們目前系統(tǒng)的配置,可知道為4個(gè)CPU,每個(gè)CPU為8核,按照上面的計(jì)算規(guī)則,這兒應(yīng)為:4x8x2=64

查看系統(tǒng)當(dāng)前thread_concurrency默認(rèn)配置命令:
show variables like 'thread_concurrency';

6. 添加skip-name-resolve,默認(rèn)被注釋掉,沒有該參數(shù)。

禁止MySQL對(duì)外部連接進(jìn)行DNS解析,使用這一選項(xiàng)可以消除MySQL進(jìn)行DNS解析的時(shí)間。但需要注意,如果開啟該選項(xiàng),則所有遠(yuǎn)程主機(jī)連接授權(quán)都要使用IP地址方式,否則MySQL將無法正常處理連接請(qǐng)求!

7. skip-networking,默認(rèn)被注釋掉。沒有該參數(shù)。(建議注釋掉,別開啟)

開啟該選項(xiàng)可以徹底關(guān)閉MySQL的TCP/IP連接方式,如果WEB服務(wù)器是以遠(yuǎn)程連接的方式訪問MySQL數(shù)據(jù)庫服務(wù)器則不要開啟該選項(xiàng)!否則將無法正常連接!

8. default-storage-engine:設(shè)置默認(rèn)存儲(chǔ)引擎

default-storage-engine= InnoDB(設(shè)置InnoDB類型,另外還可以設(shè)置MyISAM類型)

設(shè)置創(chuàng)建數(shù)據(jù)庫及表默認(rèn)存儲(chǔ)類型
顯示表的當(dāng)前存儲(chǔ)狀態(tài)值
show table status like 'tablename';
查看MySQL有哪些存儲(chǔ)狀態(tài)及默認(rèn)存儲(chǔ)狀態(tài)
show engines;
創(chuàng)建表并指定存儲(chǔ)類型
CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB;
修改表存儲(chǔ)類型:
Alter table tableName engine =engineName
備注:設(shè)置完后把以下幾個(gè)開啟:
Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /var/lib/mysql
innodb_data_file_path = ibdata1:1024M;ibdata2:10M:autoextend(要注釋掉,否則會(huì)創(chuàng)建一個(gè)新的把原來的替換的。)
innodb_log_group_home_dir = /var/lib/mysql
You can set .._buffer_pool_size up to 50 - 80 %
of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 1000M (是總內(nèi)存的50-80%,關(guān)于mysql占用資源情況設(shè)置)
innodb_additional_mem_pool_size = 20M
Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 500M ()
innodb_log_buffer_size = 20M
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 50
設(shè)置完后一定記得把MySQL安裝目錄地址(我們目前是默認(rèn)安裝所以地址/var/lib/mysql/)下的ib_logfile0和ib_logfile1刪除掉。否則重啟MySQL起動(dòng)失敗。

二、MySQL緩存變量介紹及修改

數(shù)據(jù)庫屬于IO密集型的應(yīng)用程序,其主職責(zé)就是數(shù)據(jù)的管理及存儲(chǔ)工作。而我們知道,從內(nèi)存中讀取一個(gè)數(shù)據(jù)庫的時(shí)間是微秒級(jí)別,而從一塊普通硬盤上讀取一個(gè) IO是在毫秒級(jí)別,二者相差3個(gè)數(shù)量級(jí)。所以,要優(yōu)化數(shù)據(jù)庫,首先第一步需要優(yōu)化的就是IO,盡可能將磁盤IO轉(zhuǎn)化為內(nèi)存IO。本文先從MySQL數(shù)據(jù)庫 IO相關(guān)參數(shù)(緩存參數(shù))的角度來看看可以通過哪些參數(shù)進(jìn)行IO優(yōu)化

一).全局緩存

啟動(dòng)MySQL時(shí)就要分配并且總是存在的全局緩存。目前有:key_buffer_size(默認(rèn)值:402653184,即384M)、innodb_buffer_pool_size(默認(rèn)值:134217728即:128M)、innodb_additional_mem_pool_size(默認(rèn)值:8388608即:8M)、innodb_log_buffer_size(默認(rèn)值:8388608即:8M)、query_cache_size(默認(rèn)值:33554432即:32M)等五個(gè)??偣玻?60M.
這些變量值都可以通過命令如:

show variables like '變量名'; 查看到。

1. key_buffer_size

是用于索引塊的緩沖區(qū)大小增加它可得到更好處理的索引(對(duì)所有讀和多重寫),對(duì)MyISAM表性能影響最大的一個(gè)參數(shù)。如果你使它太大,系統(tǒng)將開始換頁并且真的變慢了。嚴(yán)格說是它決定了數(shù)據(jù)庫索引處理的速度,尤其是索引讀的速度。對(duì)于內(nèi)存在4GB左右的服務(wù)器該參數(shù)可設(shè)置為256M或384M.
怎么才能知道key_buffer_size的設(shè)置是否合理呢,一般可以檢查狀態(tài)值Key_read_requests和Key_reads ,比例key_reads / key_read_requests應(yīng)該盡可能的低,比如1:100,1:1000 ,1:10000。

其值可以用以下命令查得:
show status like 'key_read%';
比如查看系統(tǒng)當(dāng)前key_read和key_read_request值為:
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Key_read_requests | 28535 |
| Key_reads | 269 |
+-------------------+-------+

可知道有28535個(gè)請(qǐng)求,有269個(gè)請(qǐng)求在內(nèi)存中沒有找到直接從硬盤讀取索引.
未命中緩存的概率為:0.94%=269/28535*100%. 一般未命中概率在0.1之下比較好。目前已遠(yuǎn)遠(yuǎn)大于0.1,證明效果不好。若命中率在0.01以下,則建議適當(dāng)?shù)男薷膋ey_buffer_size值。
http://kb.cnblogs.com/page/99810/(查看存儲(chǔ)引擎介紹)
MyISAM、InnoDB、MyISAM Merge引擎、InnoDB、memory(heap)、archive

2. innodb_buffer_pool_size

主要針對(duì)InnoDB表性能影響最大的一個(gè)參數(shù)。功能與Key_buffer_size一樣。InnoDB占用的內(nèi)存,除innodb_buffer_pool_size用于存儲(chǔ)頁面緩存數(shù)據(jù)外,另外正常情況下還有大約8%的開銷,主要用在每個(gè)緩存頁幀的描述、adaptive hash等數(shù)據(jù)結(jié)構(gòu)。如果不是安全關(guān)閉,啟動(dòng)時(shí)還要恢復(fù)的話,還要另開大約12%的內(nèi)存用于恢復(fù),兩者相加就有差不多21%的開銷。
假設(shè):12G的innodb_buffer_pool_size,最多的時(shí)候InnoDB就可能占用到14.5G的內(nèi)存。若系統(tǒng)只有16G,而且只運(yùn)行MySQL,且MySQL只用InnoDB,那么為MySQL開12G,是最大限度地利用內(nèi)存了。
另外InnoDB和 MyISAM 存儲(chǔ)引擎不同, MyISAM 的 key_buffer_size 只能緩存索引鍵,而 innodb_buffer_pool_size 卻可以緩存數(shù)據(jù)塊和索引鍵。適當(dāng)?shù)脑黾舆@個(gè)參數(shù)的大小,可以有效的減少 InnoDB 類型的表的磁盤 I/O 。
當(dāng)我們操作一個(gè) InnoDB 表的時(shí)候,返回的所有數(shù)據(jù)或者去數(shù)據(jù)過程中用到的任何一個(gè)索引塊,都會(huì)在這個(gè)內(nèi)存區(qū)域中走一遭。
可以通過 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計(jì)算緩存命中率,并根據(jù)命中率來調(diào)整 innodb_buffer_pool_size 參數(shù)大小進(jìn)行優(yōu)化。

值可以用以下命令查得:
show status like 'Innodb_buffer_pool_read%';
比如查看當(dāng)前系統(tǒng)中系統(tǒng)中
| Innodb_buffer_pool_read_requests | 1283826 |
| Innodb_buffer_pool_reads | 519 |
+---------------------------------------+---------+
其命中率99.959%=(1283826-519)/1283826*100% 命中率越高越好。

3. innodb_additional_mem_pool_size

innodb_additional_mem_pool_size設(shè)置了InnoDB存儲(chǔ)引擎用來存放數(shù)據(jù)字典信息以及一些內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間大小,所以當(dāng)我們一個(gè)MySQL Instance中的數(shù)據(jù)庫對(duì)象非常多的時(shí)候,是需要適當(dāng)調(diào)整該參數(shù)的大小以確保所有數(shù)據(jù)都能存放在內(nèi)存中提高訪問效率的。
這個(gè)參數(shù)大小是否足夠還是比較容易知道的,因?yàn)楫?dāng)過小的時(shí)候,MySQL會(huì)記錄Warning信息到數(shù)據(jù)庫的error log中,這時(shí)候你就知道該調(diào)整這個(gè)參數(shù)大小了。
查看當(dāng)前系統(tǒng)mysql的error日志 cat /var/lib/mysql/機(jī)器名.error 發(fā)現(xiàn)有很多waring警告。所以要調(diào)大為20M.
根據(jù)MySQL手冊(cè),對(duì)于2G內(nèi)存的機(jī)器,推薦值是20M。32G內(nèi)存的 100M

4. innodb_log_buffer_size

innodb_log_buffer_size是InnoDB存儲(chǔ)引擎的事務(wù)日志所使用的緩沖區(qū)。類似于Binlog Buffer,InnoDB在寫事務(wù)日志的時(shí)候,為了提高性能,也是先將信息寫入Innodb Log Buffer中,當(dāng)滿innodb_flush_log_trx_commit參數(shù)所設(shè)置的相應(yīng)條件(或者日志緩沖區(qū)寫滿)之后,才會(huì)將日志寫到文件 (或者同步到磁盤)中。可以通過innodb_log_buffer_size 參數(shù)設(shè)置其可以使用的最大內(nèi)存空間。
InnoDB 將日志寫入日志磁盤文件前的緩沖大小。理想值為 1M 至 8M。大的日志緩沖允許事務(wù)運(yùn)行時(shí)不需要將日志保存入磁盤而只到事務(wù)被提交(commit)。 因此,如果有大的事務(wù)處理,設(shè)置大的日志緩沖可以減少磁盤I/O。 在 my.cnf中以數(shù)字格式設(shè)置。
默認(rèn)是8MB,系的如頻繁的系統(tǒng)可適當(dāng)增大至4MB~8MB。當(dāng)然如上面介紹所說,這個(gè)參數(shù)實(shí)際上還和另外的flush參數(shù)相關(guān)。一般來說不建議超過32MB
注:innodb_flush_log_trx_commit參數(shù)對(duì)InnoDB Log的寫入性能有非常關(guān)鍵的影響,默認(rèn)值為1。該參數(shù)可以設(shè)置為0,1,2,解釋如下:

0:log buffer中的數(shù)據(jù)將以每秒一次的頻率寫入到log file中,且同時(shí)會(huì)進(jìn)行文件系統(tǒng)到磁盤的同步操作,但是每個(gè)事務(wù)的commit并不會(huì)觸發(fā)任何log buffer 到log file的刷新或者文件系統(tǒng)到磁盤的刷新操作;
1:在每次事務(wù)提交的時(shí)候?qū)og buffer 中的數(shù)據(jù)都會(huì)寫入到log file,同時(shí)也會(huì)觸發(fā)文件系統(tǒng)到磁盤的同步;
2:事務(wù)提交會(huì)觸發(fā)log buffer到log file的刷新,但并不會(huì)觸發(fā)磁盤文件系統(tǒng)到磁盤的同步。此外,每秒會(huì)有一次文件系統(tǒng)到磁盤同步操作。
實(shí)際測(cè)試發(fā)現(xiàn),該值對(duì)插入數(shù)據(jù)的速度影響非常大,設(shè)置為2時(shí)插入10000條記錄只需要2秒,設(shè)置為0時(shí)只需要1秒,而設(shè)置為1時(shí)則需要229秒。因此MySQL手冊(cè)也建議盡量將插入操作合并成一個(gè)事務(wù),這樣可以大幅提高速度。根據(jù)MySQL手冊(cè),在存在丟失最近部分事務(wù)的危險(xiǎn)的前提下,可以把該值設(shè)為0。

二、)局部緩存

除了全局緩沖,MySql還會(huì)為每個(gè)連接發(fā)放連接緩沖。每個(gè)連接到MySQL服務(wù)器的線程都需要有自己的緩沖。大概需要立刻分配256K,甚至在線程空閑時(shí),它們使用默認(rèn)的線程堆棧,網(wǎng)絡(luò)緩存等。事務(wù)開始之后,則需要增加更多的空間。運(yùn)行較小的查詢可能僅給指定的線程增加少量的內(nèi)存消耗,然而如果對(duì)數(shù)據(jù)表做復(fù)雜的操作例如掃描、排序或者需要臨時(shí)表,則需分配大約read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size 大小的內(nèi)存空間. 不過它們只是在需要的時(shí)候才分配,并且在那些操作做完之后就釋放了。有的是立刻分配成單獨(dú)的組塊。tmp_table_size 可能高達(dá)MySQL所能分配給這個(gè)操作的最大內(nèi)存空間了。
注意,這里需要考慮的不只有一點(diǎn)——可能會(huì)分配多個(gè)同一種類型的緩存,例如用來處理子查詢。一些特殊的查詢的內(nèi)存使用量可能更大——如果在MyISAM表上做成批的插入時(shí)需要分配 bulk_insert_buffer_size 大小的內(nèi)存;
執(zhí)行 ALTER TABLE, OPTIMIZE TABLE, REPAIR TABLE 命令時(shí)需要分配 myisam_sort_buffer_size 大小的內(nèi)存。

1. read_buffer_size:

是MySql讀入緩沖區(qū)大小。對(duì)表進(jìn)行順序掃描的請(qǐng)求將分配一個(gè)讀入緩沖區(qū),MySql會(huì)為它分配一段內(nèi)存緩沖區(qū)。read_buffer_size變量控制這一緩沖區(qū)的大小。如果對(duì)表的順序掃描請(qǐng)求非常頻繁,并且你認(rèn)為頻繁掃描進(jìn)行得太慢,可以通過增加該變量值以及內(nèi)存緩沖區(qū)大小提高其性能.

2. sort_buffer_size:

sort_buffer_size是MySql執(zhí)行排序使用的緩沖大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。如果不能,可以嘗試增加sort_buffer_size變量的大小

3. read_rnd_buffer_size:

是MySql的隨機(jī)讀緩沖區(qū)大小。當(dāng)按任意順序讀取行時(shí)(例如,按照排序順序),將分配一個(gè)隨機(jī)讀緩存區(qū)。進(jìn)行排序查詢時(shí),MySql會(huì)首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數(shù)據(jù),可適當(dāng)調(diào)高該值。但MySql會(huì)為每個(gè)客戶連接發(fā)放該緩沖空間,所以應(yīng)盡量適當(dāng)設(shè)置該值,以避免內(nèi)存開銷過大。

4. tmp_table_size:

tmp_table_size是MySql的heap (堆積)表緩沖大小。所有聯(lián)合在一個(gè)DML指令內(nèi)完成,并且大多數(shù)聯(lián)合甚至可以不用臨時(shí)表即可以完成。大多數(shù)臨時(shí)表是基于內(nèi)
存的(HEAP)表。具有大的記錄長度的臨時(shí)表 (所有列的長度的和)或包含BLOB列的表存儲(chǔ)在硬盤上。如果某個(gè)內(nèi)部heap(堆積)表大小超過tmp_table_size,MySQL可以根據(jù)需要自
動(dòng)將內(nèi)存中的heap表改為基于硬盤的MyISAM表。還可以通過設(shè)置tmp_table_size選項(xiàng)來增加臨時(shí)表的大小。也就是說,如果調(diào)高該值,MySql同時(shí)將增加heap表的大小,可達(dá)到提高
聯(lián)接查詢速度的效果。

5. record_buffer:

record_buffer每個(gè)進(jìn)行一個(gè)順序掃描的線程為其掃描的每張表分配這個(gè)大小的一個(gè)緩沖區(qū)。如果你做很多順序掃描,你可能想要增加該值。默認(rèn)數(shù)值是131072 (128K)

三、)其他緩存

1. table_cache :

TABLE_CACHE(5.1.3及以后版本又名TABLE_OPEN_CACHE)
table_cache指定表高速緩存的大小。每當(dāng)MySQL訪問一個(gè)表時(shí),如果在表緩沖區(qū)中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內(nèi)容。通過檢查峰值時(shí)間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現(xiàn)open_tables等于table_cache,并且opened_tables在不斷增長,那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables’獲得)。
注意,不能盲目地把table_cache設(shè)置成很大的值。如果設(shè)置得太高,可能會(huì)造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。

show status like 'Open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 356 |
| Opened_tables | 0 |
+---------------+-------+

open_tables表示當(dāng)前打開的表緩存數(shù),如果執(zhí)行flush tables操作,則此系統(tǒng)會(huì)關(guān)閉一些當(dāng)前沒有使用的表緩存而使得此狀態(tài)值減?。?br> opend_tables表示曾經(jīng)打開的表緩存數(shù),會(huì)一直進(jìn)行累加,如果執(zhí)行flush tables操作,值不會(huì)減小。
在mysql默認(rèn)安裝情況下,table_cache的值在2G內(nèi)存以下的機(jī)器中的值默認(rèn)時(shí)256到512,如果機(jī)器有4G內(nèi)存,則默認(rèn)這個(gè)值 是2048,但這決意味著機(jī)器內(nèi)存越大,這個(gè)值應(yīng)該越大,因?yàn)閠able_cache加大后,使得mysql對(duì)SQL響應(yīng)的速度更快了,不可避免的會(huì)產(chǎn)生 更多的死鎖(dead lock),這樣反而使得數(shù)據(jù)庫整個(gè)一套操作慢了下來,嚴(yán)重影響性能。所以平時(shí)維護(hù)中還是要根據(jù)庫的實(shí)際情況去作出判斷,找到最適合你維護(hù)的庫的 table_cache值。
由于MySQL是多線程的機(jī)制,為了提高性能,每個(gè)線程都是獨(dú)自打開自己需要的表的文件描 述符,而不是通過共享已經(jīng)打開的.針對(duì)不同存儲(chǔ)引擎處理的方法當(dāng)然也不一樣
在myisam表引擎中,數(shù)據(jù)文件的描述符 (descriptor)是不共享的,但是索引文件的描述符卻是所有線程共享的.Innodb中和使用表空間類型有關(guān),假如是共享表空間那么實(shí)際就一個(gè)數(shù) 據(jù)文件,當(dāng)然占用的數(shù)據(jù)文件描述符就會(huì)比獨(dú)立表空間少.
mysql手冊(cè)上給的建議大小 是:table_cache=max_connections*n
n表示查詢語句中最大表數(shù), 還需要為臨時(shí)表和文件保留一些額外的文件描述符
這個(gè)數(shù)據(jù)遭到很多質(zhì)疑,table_cache夠用就好,檢查 Opened_tables值,如果這個(gè)值很大,或增長很快那么你就得考慮加大table_cache了.
table_cache:所有線程打開的表的數(shù)目。增大該值可以增加mysqld需要的文件描述符的數(shù)量。默認(rèn)值是64.

2. thread_cache_size:

默認(rèn)的thread_cache_size=8,但是看到好多配置的樣例里的值一般是32,64,甚至是128,感覺這個(gè)參數(shù)對(duì)優(yōu)化應(yīng)該有幫助,于是查了下:
根據(jù)調(diào)查發(fā)現(xiàn)以上服務(wù)器線程緩存thread_cache_size沒有進(jìn)行設(shè)置,或者設(shè)置過小,這個(gè)值表示可以重新利用保存在緩存中線程的數(shù)量,當(dāng)斷開連接時(shí)如果緩存中還有空間,那么客戶端的線程將被放到緩存中,如果線程重新被請(qǐng)求,那么請(qǐng)求將從緩存中讀取,如果緩存中是空的或者是新的請(qǐng)求,那么這個(gè)線程將被重新創(chuàng)建,如果有很多新的線程,增加這個(gè)值可以改善系統(tǒng)性能.通過比較 Connections 和 Threads_created 狀態(tài)的變量,可以看到這個(gè)變量的作用。(–>表示要調(diào)整的值) 根據(jù)物理內(nèi)存設(shè)置規(guī)則如下:

1G —> 8
2G —> 16
3G —> 32 >3G —> 64
show status like 'thread%';
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| Threads_cached | 0 | <—當(dāng)前被緩存的空閑線程的數(shù)量
| Threads_connected | 1 | <—正在使用(處于連接狀態(tài))的線程
| Threads_created | 1498 | <—服務(wù)啟動(dòng)以來,創(chuàng)建了多少個(gè)線程
| Threads_running | 1 | <—正在忙的線程(正在查詢數(shù)據(jù),傳輸數(shù)據(jù)等等操作)
+——————-+——-+
查看開機(jī)起來數(shù)據(jù)庫被連接了多少次?
show status like '%connection%';
+———————-+——-+
| Variable_name | Value |
+———————-+——-+
| Connections | 1504 | –>服務(wù)啟動(dòng)以來,歷史連接數(shù)
| Max_used_connections | 2 |
+———————-+——-+

通過連接線程池的命中率來判斷設(shè)置值是否合適?命中率超過90%以上,設(shè)定合理。

(Connections - Threads_created) / Connections * 100 %

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容