一缚陷、應(yīng)用優(yōu)化
在實際生產(chǎn)環(huán)境中,由于數(shù)據(jù)庫本身的性能局限往核,就必須要對前臺的應(yīng)用進行一些優(yōu)化箫爷,來降低數(shù)據(jù)庫的訪問壓力。
1.1聂儒、使用連接池
對于訪問數(shù)據(jù)庫來說虎锚,建立連接的代價是比較昂貴的,因為我們頻繁的創(chuàng)建關(guān)閉連接衩婚,是比較耗費資源的窜护,我們必須要使用數(shù)據(jù)庫連接池,以提高訪問的性能非春。
1.2柱徙、減少對MySQL的訪問
避免對數(shù)據(jù)進行重復(fù)檢索
在編寫應(yīng)用代碼時,需要能夠理清對數(shù)據(jù)庫的訪問邏輯税娜。能夠一次連接就獲取到結(jié)果的坐搔,就不用兩次連接,這樣可以大大減少對數(shù)據(jù)庫無用的重復(fù)請求敬矩。
比如 概行,需要獲取書籍的id 和name字段 , 則查詢?nèi)缦拢?/p>
select id , name from tb_book;
之后弧岳,在業(yè)務(wù)邏輯中有需要獲取到書籍狀態(tài)信息凳忙, 則查詢?nèi)缦拢?/p>
select id , status from tb_book;
這樣,就需要向數(shù)據(jù)庫提交兩次請求禽炬,數(shù)據(jù)庫就要做兩次查詢操作涧卵。其實完全可以用一條SQL語句得到想要的結(jié)果。
select id, name , status from tb_book;
增加cache層
在應(yīng)用中腹尖,我們可以在應(yīng)用中增加 緩存 層來達到減輕數(shù)據(jù)庫負擔的目的柳恐。緩存層有很多種,也有很多實現(xiàn)方式热幔,只要能達到降低數(shù)據(jù)庫的負擔又能滿足應(yīng)用需求就可以乐设。
因此可以部分數(shù)據(jù)從數(shù)據(jù)庫中抽取出來放到應(yīng)用端以文本方式存儲, 或者使用框架(Mybatis, Hibernate)提供的一級緩存/二級緩存绎巨,或者使用redis數(shù)據(jù)庫來緩存數(shù)據(jù)近尚,還可以使用基于Guava Cache的JVM級別的內(nèi)存緩存。
1.3场勤、負載均衡
負載均衡是應(yīng)用中使用非常普遍的一種優(yōu)化方法戈锻,它的機制就是利用某種均衡算法歼跟,將固定的負載量分布到不同的服務(wù)器上, 以此來降低單臺服務(wù)器的負載格遭,達到優(yōu)化的效果哈街。
利用MySQL復(fù)制分流查詢
通過MySQL的主從復(fù)制,實現(xiàn)讀寫分離如庭,使增刪改操作走主節(jié)點叹卷,查詢操作走從節(jié)點,從而可以降低單臺服務(wù)器的讀寫壓力坪它。
采用分布式數(shù)據(jù)庫架構(gòu)
分布式數(shù)據(jù)庫架構(gòu)適合大數(shù)據(jù)量骤竹、負載高的情況,它有良好的拓展性和高可用性往毡。通過在多臺服務(wù)器之間分布數(shù)據(jù)蒙揣,可以實現(xiàn)在多臺服務(wù)器之間的負載均衡,提高訪問效率开瞭。
可以采用MySQL的MMM或MHA架構(gòu)懒震,業(yè)界成熟和應(yīng)用比較廣的MHA架構(gòu)
MySQL集群高可用架構(gòu):http://www.reibang.com/p/14d1c07820ce
二、Mysql中查詢緩存優(yōu)化
寫在前面:查詢緩存從MySQL 5.7.20開始已被棄用嗤详,并在MySQL 8.0中被刪除个扰。
考慮到當前的局限性,在MySQL 5.7的生存期內(nèi)將繼續(xù)支持查詢緩存葱色。MySQL 8.0將不支持查詢緩存递宅,并且鼓勵用戶升級以使用服務(wù)器端查詢重寫或ProxySQL作為中間人緩存。
2.1苍狰、概述
Query cache 作用于整個 MySQL办龄,主要用來緩存 MySQL 中的查詢結(jié)果集,也就是一條SQL語句執(zhí)行的結(jié)果集淋昭,所以僅僅只能針對select語句俐填。當我們打開了 Query Cache 功能,MySQL在接受到一條select語句的請求后翔忽,如果命中緩存英融,也就是說所需結(jié)果集已經(jīng)在緩存中了,后面一系列步驟都不用再執(zhí)行歇式,直接從緩存拿到結(jié)果集返回給客戶端矢赁,可以極大的提高查詢性能!
開啟Mysql的查詢緩存贬丛,當執(zhí)行完全相同的SQL語句的時候,服務(wù)器就會直接從緩存中讀取結(jié)果给涕,當數(shù)據(jù)被修改豺憔,之前的緩存會失效额获,修改比較頻繁的表不適合做查詢緩存。
2.2恭应、執(zhí)行步驟
sql 查詢數(shù)據(jù)庫 執(zhí)行步驟如下:
- 1抄邀、客戶端發(fā)送一條查詢給服務(wù)器。
- 2昼榛、服務(wù)器先會檢查查詢緩存境肾,如果命中了緩存,則立即返回存儲在緩存中的結(jié)果胆屿。否則進入下一階段奥喻。
- 3、服務(wù)器端進行SQL解析非迹、預(yù)處理环鲤,再由優(yōu)化器生成對應(yīng)的執(zhí)行計劃。
- 4憎兽、MySQL根據(jù)優(yōu)化器生成的執(zhí)行計劃冷离,調(diào)用存儲引擎的API來執(zhí)行查詢。
- 5纯命、將結(jié)果返回給客戶端西剥。
2.3、查詢緩存配置
- 1亿汞、查看當前的MySQL數(shù)據(jù)庫是否支持查詢緩存:
SHOW VARIABLES LIKE 'have_query_cache';
- 2瞭空、查看當前MySQL是否開啟了查詢緩存 :
SHOW VARIABLES LIKE 'query_cache_type';
- 3、查看查詢緩存的占用大小 :
SHOW VARIABLES LIKE 'query_cache_size';
- 4留夜、查看查詢緩存的狀態(tài)變量:
SHOW STATUS LIKE 'Qcache%';
各個變量的含義如下:
參數(shù) | 含義 |
---|---|
Qcache_free_blocks | 查詢緩存中的可用內(nèi)存塊數(shù) |
Qcache_free_memory | 查詢緩存的可用內(nèi)存量 |
Qcache_hits | 查詢緩存命中數(shù) |
Qcache_inserts | 添加到查詢緩存的查詢數(shù) |
Qcache_lowmen_prunes | 由于內(nèi)存不足而從查詢緩存中刪除的查詢數(shù) |
Qcache_not_cached | 非緩存查詢的數(shù)量(由于 query_cache_type 設(shè)置而無法緩存或未緩存) |
Qcache_queries_in_cache | 查詢緩存中注冊的查詢數(shù) |
Qcache_total_blocks | 查詢緩存中的塊總數(shù) |
2.4匙铡、開啟查詢緩存
MySQL的查詢緩存默認是關(guān)閉的,需要手動配置參數(shù) query_cache_type 碍粥, 來開啟查詢緩存鳖眼。
query_cache_type 該參數(shù)的可取值有三個 :
值 | 含義 |
---|---|
OFF 或 0 | 查詢緩存功能關(guān)閉 |
ON 或 1 | 查詢緩存功能打開,SELECT的結(jié)果符合緩存條件即會緩存嚼摩, 否則钦讳,不予緩存,顯式指定SQL_NO_CACHE枕面,不予緩存 |
DEMAND 或 2 | 查詢緩存功能按需進行愿卒,顯式指定 SQL_CACHE 的SELECT 語句才會緩存;其它均不予緩存 |
在 /etc/my.cnf 配置中潮秘,增加以下配置 :
#開啟Mysql的查詢緩存琼开,決定是否緩存查詢結(jié)果。這個變量有三個取值:0,1,2枕荞,分別代表了off柜候、on搞动、demand。
query_cache_type = 1
配置完畢之后渣刷,重啟服務(wù)既可生效 鹦肿;
然后就可以在命令行執(zhí)行SQL語句進行驗證 ,執(zhí)行一條比較耗時的SQL語句辅柴,然后再多執(zhí)行幾次箩溃,查看后面幾次的執(zhí)行時間;獲取通過查看查詢緩存的緩存命中數(shù)碌嘀,來判定是否走查詢緩存们童。
2.5磷籍、查詢緩存SELECT選項
可以在SELECT語句中指定兩個與查詢緩存相關(guān)的選項 :
- SQL_CACHE:如果查詢結(jié)果是可緩存的,并且 query_cache_type 系統(tǒng)變量的值為ON或 DEMAND ,則緩存查詢結(jié)果 荞彼。
- SQL_NO_CACHE:服務(wù)器不使用查詢緩存尽爆。它既不檢查查詢緩存谣旁,也不檢查結(jié)果是否已緩存秦陋,也不緩存查詢結(jié)果。
例子:
SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;
2.6导俘、查詢緩存失效的情況
- 1峦耘、SQL 語句不一致的情況, 要想命中查詢緩存旅薄,查詢的SQL語句必須一致辅髓。
SQL1 : select count(*) from tb_item;
SQL2 : Select count(*) from tb_item;
- 2、當查詢語句中有一些不確定的時少梁,則不會緩存洛口。如 : now()、current_date()凯沪、curdate()第焰、curtime()、rand()妨马、uuid()挺举、user()、database() 烘跺。
SQL1 : select * from tb_item where updatetime < now() limit 1;
SQL2 : select user();
SQL3 : select database();
- 3湘纵、不使用任何表查詢語句。
select 'A';
- 4滤淳、查詢 mysql梧喷, information_schema或 performance_schema 數(shù)據(jù)庫中的表時,不會走查詢緩存。
select * from information_schema.engines;
5铺敌、在存儲的函數(shù)绊困,觸發(fā)器或事件的主體內(nèi)執(zhí)行的查詢。
6适刀、如果表更改,則使用該表的所有高速緩存查詢都將變?yōu)闊o效并從高速緩存中刪除煤蹭。這包括使用 MERGE 映射到已更改表的表的查詢笔喉。一個表可以被許多類型的語句,如被改變 INSERT硝皂、UPDATE常挚、DELETE、TRUNCATE TABLE稽物、ALTER TABLE奄毡、DROP TABLE 或 DROP DATABASE 。
三贝或、MySQL內(nèi)存管理及優(yōu)化
3.1吼过、內(nèi)存優(yōu)化原則
- 1、將盡量多的內(nèi)存分配給MySQL做緩存咪奖,但要給操作系統(tǒng)和其他程序預(yù)留足夠內(nèi)存盗忱。
- 2、MyISAM 存儲引擎的數(shù)據(jù)文件讀取依賴于操作系統(tǒng)自身的IO緩存羊赵,因此趟佃,如果有MyISAM表,就要預(yù)留更多的內(nèi)存給操作系統(tǒng)做IO緩存昧捷。
- 3闲昭、排序區(qū)、連接區(qū)等緩存是分配給每個數(shù)據(jù)庫會話(session)專用的靡挥,其默認值的設(shè)置要根據(jù)最大連接數(shù)合理分配序矩,如果設(shè)置太大,不但浪費資源芹血,而且在并發(fā)連接較高時會導(dǎo)致物理內(nèi)存耗盡贮泞。
3.2、MyISAM 內(nèi)存優(yōu)化
myisam存儲引擎使用 key_buffer 緩存索引塊幔烛,加速myisam索引的讀寫速度啃擦。對于myisam表的數(shù)據(jù)塊,mysql沒有特別的緩存機制饿悬,完全依賴于操作系統(tǒng)的IO緩存令蛉。
key_buffer_size
key_buffer_size決定MyISAM索引塊緩存區(qū)的大小,直接影響到MyISAM表的存取效率≈槭澹可以在MySQL參數(shù)文件中設(shè)置key_buffer_size的值蝎宇,對于一般MyISAM數(shù)據(jù)庫,建議至少將1/4可用內(nèi)存分配給key_buffer_size祷安。
在/etc/my.cnf 中做如下配置:
key_buffer_size=512M
read_buffer_size
如果需要經(jīng)常順序掃描myisam表姥芥,可以通過增大read_buffer_size的值來改善性能。但需要注意的是read_buffer_size是每個session獨占的汇鞭,如果默認值設(shè)置太大凉唐,就會造成內(nèi)存浪費。
read_rnd_buffer_size
對于需要做排序的myisam表的查詢霍骄,如帶有order by子句的sql台囱,適當增加 read_rnd_buffer_size 的值,可以改善此類的sql性能读整。但需要注意的是read_rnd_buffer_size 是每個session獨占的簿训,如果默認值設(shè)置太大,就會造成內(nèi)存浪費米间。
3.3强品、InnoDB 內(nèi)存優(yōu)化
innodb用一塊內(nèi)存區(qū)做IO緩存池,該緩存池不僅用來緩存innodb的索引塊车伞,而且也用來緩存innodb的數(shù)據(jù)塊择懂。
在內(nèi)部,innodb 緩存池邏輯上由 free list另玖、flush list 和 lru list 組成:
- free list:空閑緩存塊列表
- flush list:是需要刷新到此磁盤的緩存塊列表
- lru list:是 innodb 正在使用的緩存塊困曙,它是 innodb buffer pool 的核心。
innodb 使用的 lru 算法與 myisam 的“中點插入策略”lru算法很類似谦去,大致原理是:將 lru list 分為 young sublist 和 old sublist慷丽,數(shù)據(jù)從磁盤讀入時,會將該緩存塊插入到 lru list 的“中點”鳄哭,即 old sublist 的頭部要糊;經(jīng)過一定時間的訪問(由 innodb_old_blocks_time 系統(tǒng)參數(shù)決定),該數(shù)據(jù)塊將會由 old sublist 轉(zhuǎn)移到 young sublist 的頭部妆丘,也就是整個lru list 的頭部锄俄;隨著時間推移,young sublist 和 old sublist 中較少被訪問的緩存塊將從各自鏈表的頭部逐漸向尾部移動勺拣;需要淘汰數(shù)據(jù)塊時奶赠,優(yōu)先從鏈表尾部淘汰。這種設(shè)計同樣是為了防止偶爾被訪問的索引塊將訪問頻繁的熱塊淘汰药有。
innodb_buffer_pool_size
該變量決定了 innodb 存儲引擎表數(shù)據(jù)和索引數(shù)據(jù)的最大緩存區(qū)大小毅戈。在保證操作系統(tǒng)及其他程序有足夠內(nèi)存可用的情況下苹丸,innodb_buffer_pool_size 的值越大,緩存命中率越高苇经,訪問InnoDB表需要的磁盤I/O 就越少赘理,性能也就越高。
在一個專用的數(shù)據(jù)庫服務(wù)器上可以將 80% 的物理內(nèi)存分配給 InnoDB buffer pool 扇单,需要注意避免設(shè)置過大而導(dǎo)致頁的交換商模。
#查看 buffer pool 的使用情況
show global status like '%Innodb_buffer_pool%';
#計算 InnoDB 緩存池的命中率,如果命中率太低,則應(yīng)該考慮擴充內(nèi)存蜘澜、增加 innodb_buffer_pool_size 的值
(1-Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests)*100
?參考設(shè)置:
1)物理內(nèi)存小于 1 GB
innodb_buffer_pool_size=128M
innodb_log_file_size=48M
2)物理內(nèi)存為 1 GB ~ 4GB
innodb_buffer_pool_size=物理內(nèi)存*0.5
innodb_log_file_size=128M
3)物理內(nèi)存大于 4 GB
innodb_buffer_pool_size=物理內(nèi)存*0.75
innodb_log_file_size=1024M
innodb_log_buffer_size
決定了innodb重做日志緩存的大小阻桅,對于可能產(chǎn)生大量更新記錄的大事務(wù),增加innodb_log_buffer_size的大小兼都,可以避免innodb在事務(wù)提交前就執(zhí)行不必要的日志寫入磁盤操作。
innodb_log_buffer_size=10M
innodb_old_blocks_pct
?innodb_old_blocks_pct (old sublist 的比例)稽寒,可以根據(jù) InnoDB Monitor的輸出信息來調(diào)整 innodb_old_blocks_pct 的值扮碧。如果 youngs/s 的值很低,可能需要適當增大innodb_old_blocks_pct 的值或減少 innodb_old_blocks_time 的值杏糙。
show engine innodb status\G;
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
=====================================
......
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
......
當然慎王,調(diào)整 old_sublist 的比例由系統(tǒng)參數(shù) innodb_old_blocks_pct 決定,其取值范圍是 5 ~ 95, 默認值是 37宏侍。
通過以下命令可以查看其當前設(shè)置:
show global variables like '%innodb_old_blocks_pct%';
innodb_old_blocks_time
?一個緩存數(shù)據(jù)塊被插入到 midpoint(old sublist)后赖淤,至少要在 old sublist 停留超過 innodb_old_blocks_time(ms)后,才有可能被轉(zhuǎn)移到 young sublist谅河。
?可以根據(jù) InnoDB Monitor的輸出信息來調(diào)整 innodb_old_blocks_time 的值咱旱。在進行表掃描時,如果 non-youngs/s 很低绷耍,youngs/s 很高吐限,就應(yīng)該考慮將 innodb_old_blocks_time 適當調(diào)大,以防止表掃描將真正的熱數(shù)據(jù)淘汰褂始。
show engine innodb status\G;
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
=====================================
......
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
......
innodb_buffer_pool_instances
?適當增加此參數(shù)的值诸典,可以降低并發(fā)導(dǎo)致的內(nèi)部緩存訪問沖突,改善性能崎苗。 InnoDB 緩存系統(tǒng)會將 innodb_buffer_pool_size 的大小平分為 innodb_buffer_pool_instances 個 buffer pool狐粱。
innodb_max_dirty_pages_pct
- 1、控制緩沖池中臟頁的最大比例胆数,如果臟頁達到或超過該值肌蜻, InnoDB 后臺線程將開始緩存刷新。
- 2幅慌、若 Innodb_buffer_pool_wait_free 的值增長較快宋欺,則說明 InnoDB 經(jīng)常在等待空閑緩存頁,如果無法增大緩存池,那么應(yīng)將 innodb_max_dirty_pages_pct的值調(diào)小或?qū)?innodb_io_capacity 的值提高齿诞,以加快臟頁的刷新酸休。
innodb_io_capacity
?* 1、代表磁盤系統(tǒng)的 I/O 能力祷杈,對于轉(zhuǎn)速較低的磁盤斑司;如 7200RPM 的磁盤,可將 innodb_io_capacity 的值降低到 100但汞;而對于固態(tài)硬盤和由多個磁盤組成的盤陣宿刮,innodb_io_capacity 的值可以適當增大。對于固態(tài)硬盤來說私蕾,建議設(shè)置為 2000 或者更高僵缺。
2、innodb_io_capacity 決定一批刷新臟頁的數(shù)量踩叭,當緩存池臟頁的比例達到 innodb_max_dirty_pages_pct 時磕潮, InnoDB 大約將 innodb_io_capacity 個已改變的緩存頁刷新到磁盤。
3容贝、當臟頁小于 innodb_max_dirty_pages_pct 時自脯,如果 innodb_adaptive_flushing=ON,InnoDB 將根據(jù)函數(shù) buf_flush_get_desired_flush_rate 返回的重做日志產(chǎn)生的速度來確定要刷新的臟頁數(shù)斤富。
4膏潮、在合并插入緩存時,InnoDB 每次合并的頁數(shù)是 0.05*innodb_io_capacity
5满力、若 Innodb_buffer_pool_wait_free 的值增長較快焕参,則說明 InnoDB 經(jīng)常在等待空閑緩存頁,如果無法增大緩存池油额,那么應(yīng)將 innodb_max_dirty_pages_pct的值調(diào)小或?qū)?innodb_io_capacity 的值提高龟糕,以加快臟頁的刷新。
innodb_doublewrite
對于要求超高性能悔耘,有能容忍極端情況下少量數(shù)據(jù)丟失的應(yīng)用讲岁,可以通過在配置文件中增加 innodb_doublewrite=0 參數(shù)設(shè)置來關(guān)閉 innodb_doublewrite,以盡量滿足性能方面的要求衬以。
join_buffer_size & sort_buffer_size
?如果 Sort_merge_passes 的值很大缓艳,可以考慮調(diào)整參數(shù) sort_buffer_size 的值來增大排序緩存區(qū),以改善帶有 order by 子句或 group 子句 SQL 的性能看峻。
show global status like 'Sort_merge_passes';
注意:join_buffer_size 和 sort_buffer_size 都是面向用戶服務(wù)線程分配的阶淘,如果設(shè)置過大造成內(nèi)存浪費,甚至導(dǎo)致內(nèi)存交換互妓。尤其是 join_buffer_size溪窒,如果是多表關(guān)聯(lián)的復(fù)雜查詢坤塞,還可能會分配多個 join buffer,因此最好是設(shè)置較小的全局 join_buffer_size澈蚌,而對需要做復(fù)雜連接操作的 session 單獨設(shè)置較大的 join_buffer_size摹芙。
四、MySQL并發(fā)參數(shù)調(diào)整
從實現(xiàn)上來說宛瞄,MySQL Server 是多線程結(jié)構(gòu)浮禾,包括后臺線程和客戶服務(wù)線程。多線程可以有效利用服務(wù)器資源份汗,提高數(shù)據(jù)庫的并發(fā)性能盈电。在Mysql中,控制并發(fā)連接和線程的主要參數(shù)包括 max_connections杯活、back_log匆帚、thread_cache_size、table_open_cahce旁钧。
4.1卷扮、max_connections
采用max_connections 控制允許連接到MySQL數(shù)據(jù)庫的最大數(shù)量,默認值是 151均践。如果狀態(tài)變量 connection_errors_max_connections 不為零,并且一直增長摩幔,則說明不斷有連接請求因數(shù)據(jù)庫連接數(shù)已達到允許最大值而失敗彤委,這是可以考慮增大max_connections 的值。
Mysql 最大可支持的連接數(shù)或衡,取決于很多因素焦影,包括給定操作系統(tǒng)平臺的線程庫的質(zhì)量、內(nèi)存大小封断、每個連接的負荷斯辰、CPU的處理速度,期望的響應(yīng)時間等坡疼。在Linux 平臺下彬呻,性能好的服務(wù)器,支持 500-1000 個連接不是難事柄瑰,需要根據(jù)服務(wù)器性能進行評估設(shè)定闸氮。
注意:每一個 session 操作 MySQL 數(shù)據(jù)庫表都需要占用文件描述符,數(shù)據(jù)庫連接本身也要占用文件描述符教沾,因此在增大 max_connections 值時蒲跨,也要注意評估 open_files_limit 的設(shè)置是否夠用。
4.2授翻、back_log
back_log 參數(shù)控制MySQL監(jiān)聽TCP端口時設(shè)置的積壓請求棧大小或悲。如果MySql的連接數(shù)達到max_connections時孙咪,新來的請求將會被存在堆棧中,以等待某一連接釋放資源巡语,該堆棧的數(shù)量即back_log翎蹈,如果等待連接的數(shù)量超過back_log,將不被授予連接資源捌臊,將會報錯杨蛋。5.6.6 版本之前默認值為50,之后的版本默認為50 +(max_connections / 5)理澎, 但最大不超過900逞力。
如果需要數(shù)據(jù)庫在較短的時間內(nèi)處理大量連接請求, 可以考慮適當增大back_log 的值糠爬。
4.3寇荧、table_open_cache
- 1、該參數(shù)用來控制所有SQL語句執(zhí)行線程可打開表緩存的數(shù)量执隧。
- 2揩抡、每一個 SQL 執(zhí)行線程至少都要打開 1 個表緩存,這個參數(shù)可以根據(jù) max_connections(最大連接數(shù)) * N(每個連接關(guān)聯(lián)查詢中所涉及表的最大個數(shù)) 來設(shè)定镀琉。
- 3峦嗤、在未執(zhí)行 flush tables 命令的情況下,如果 MySQL 狀態(tài)變量 Opened_tables 的值較大,說明 table_open_cache 設(shè)置的過小,應(yīng)適當增大。
- 4屋摔、注意:增大 table_open_cache 的值烁设,會增加 MySQL 對文件描述符的使用量,因此钓试,需要注意評估 open_files_limit 的設(shè)置是否夠用装黑。
4.4 thread_cache_size
為了加快連接數(shù)據(jù)庫的速度,MySQL 會緩存一定數(shù)量的客戶服務(wù)線程以備重用弓熏,通過參數(shù) thread_cache_size 可控制 MySQL 緩存客戶服務(wù)線程的數(shù)量恋谭。
通過計算線程 cache 的失效率 Threads_created/Connections 來調(diào)整 thread_cache_size 值。該值越接近1挽鞠,說明線程 cache 命中率越低疚颊,應(yīng)該考慮 適當增加 thread_cache_size 的值。
innodb_lock_wait_timeout
- 1信认、該參數(shù)是用來設(shè)置InnoDB 事務(wù)等待行鎖的時間串稀,默認值是50ms , 可以根據(jù)需要進行動態(tài)設(shè)置狮杨。
- 2母截、對于需要快速反饋的業(yè)務(wù)系統(tǒng)來說,可以將行鎖的等待時間調(diào)小橄教,以避免事務(wù)長時間掛起清寇。
- 3喘漏、對于后臺運行的批量處理程序來說,可以將行鎖的等待時間調(diào)大华烟, 以避免發(fā)生大的回滾操作翩迈。
https://blog.51cto.com/11286233/2043902
https://www.cnblogs.com/Mr-Echo/p/12155461.html