mysql-應用層,查詢緩存,內存管理方面的優化

一,MySQL應用層的優化

實際生產環境中,由於數據庫本身的性能侷限,需要對應用層做一些優化,來降低數據庫的訪問壓力

1,使用數據庫連接池

頻繁的創建關閉連接,是比較耗費資源的,有必要建立 數據庫連接池,以提高訪問的性能。

2,減少對mysql的訪問

1)能一次請求拿全數據的,最好一次拿完,不要查多次

2) 我們可以在應用中增加 緩存 層來達到減輕數據庫負擔的目的。緩存層有很多種,也有很多實現方式,只要能達到降低數據庫的負擔又能滿足應用需求就可以。

​ 因此可以部分數據從數據庫中抽取出來放到應用端以文本方式存儲, 或者使用框架(Mybatis等)提供的一級緩存/二級緩存,或者使用redis數據庫來緩存數據 。

3,負載均衡

負載均衡是應用中使用非常普遍的一種優化方法,它的機制就是利用某種均衡算法,將固定的負載量分佈到不同的服務器上, 以此來降低單臺服務器的負載,達到優化的效果

1,通過MySQL的主從複製,實現讀寫分離,使增刪改操作走主節點,查詢操作走從節點,從而可以降低單臺服務器的讀寫壓力。

主從複製具體實現可以參考我的這篇博客:MySQL主從複製

2,採用分佈式數據庫架構,分佈式數據庫架構適合大數據量、負載高的情況,它有良好的拓展性和高可用性。通過在多臺服務器之間分佈數據,可以實現在多臺服務器之間的負載均衡,提高訪問效率。

二,mysql中查詢緩存的優化

開啓mysql查詢緩存,當執行完全相同的sql語句的時候,服務器就會直接從緩存中讀取結果,當數據被修改,之前的緩存就會失效,修改比較頻繁的表不適合做查詢緩存

1,查詢緩存的流程

在這裏插入圖片描述

1)客戶端發送一條查詢給服務器;

2)服務器先會檢查查詢緩存,如果命中了緩存,則立即返回存儲在緩存中的結果。否則進入下一階段;

3)服務器端進行SQL解析、預處理,再由優化器生成對應的執行計劃;

4)MySQL根據優化器生成的執行計劃,調用存儲引擎的API來執行查詢;

5)將結果返回給客戶端。

2,查詢緩存配置

1)查看當前的數據庫是否支持查詢緩存

SHOW VARIABLES LIKE 'have_query_cache';	

2)查看當前的數據庫是否開啓了查詢緩存

SHOW VARIABLES LIKE 'query_cache_type';

3)查看查詢緩存佔用的大小

SHOW VARIABLES LIKE 'query_cache_size';

4)查看查詢緩存的狀態變量

SHOW STATUS LIKE 'Qcache%';

5)開啓查詢緩存

需要在my,cnf 中增加配置

#開啓mysql查詢緩存配置,
#0或OFF 標識關閉查詢緩存,1或ON 打開查詢緩存,2或DEMAND 顯示指定SQL_CACHE 的SELECT語句纔會緩存
query_cache_type=1

6)查詢緩存SELECT選項

在select語句中可以指定兩個與查詢緩存相關的選項

#SQL_CACHE : 如果查詢結果是可緩存的
#SQL_NO_CACHE : 服務器不使用查詢緩存
SELECT SQL_CACHE id, name FROM user;
SELECT SQL_NO_CACHE id, name FROM user;

7)查詢緩存失效的情況

1,sql語句不一致不觸發,例:select大小寫
SQL1 : select count(*) from user;
SQL2 : Select count(*) from user;

2,查詢語句中使用了一些不確定的函數
select * from user where updatetime < now() limit 1;

3,查詢 mysql, information_schema或  performance_schema 數據庫中的表時,不會走查詢緩存。

三,mysql內存管理及優化

1,MyISAM 內存優化

myisam存儲引擎使用 key_buffer 緩存索引塊,加速myisam索引的讀寫速度。對於myisam表的數據塊,mysql沒有特別的緩存機制,完全依賴於操作系統的IO緩存。

key_buffer_size

key_buffer_size決定MyISAM索引塊緩存區的大小,直接影響到MyISAM表的存取效率。可以在MySQL參數文件中設置key_buffer_size的值,對於一般MyISAM數據庫,建議至少將1/4可用內存分配給key_buffer_size。

在 my.cnf 中做如下配置:

key_buffer_size=512M
read_buffer_size

如果需要經常順序掃描myisam表,可以通過增大read_buffer_size的值來改善性能。但需要注意的是read_buffer_size是每個session獨佔的,如果默認值設置太大,就會造成內存浪費。

read_rnd_buffer_size

對於需要做排序的myisam表的查詢,如帶有order by子句的sql,適當增加 read_rnd_buffer_size 的值,可以改善此類的sql性能。但需要注意的是 read_rnd_buffer_size 是每個session獨佔的,如果默認值設置太大,就會造成內存浪費。

2, InnoDB 內存優化

innodb用一塊內存區做IO緩存池,該緩存池不僅用來緩存innodb的索引塊,而且也用來緩存innodb的數據塊

innodb_buffer_pool_size

該變量決定了 innodb 存儲引擎表數據和索引數據的最大緩存區大小。在保證操作系統及其他程序有足夠內存可用的情況下,innodb_buffer_pool_size 的值越大,緩存命中率越高,訪問InnoDB表需要的磁盤I/O 就越少,性能也就越高。

innodb_buffer_pool_size=512M
innodb_log_buffer_size

決定了innodb重做日誌緩存的大小,對於可能產生大量更新記錄的大事務,增加innodb_log_buffer_size的大小,可以避免innodb在事務提交前就執行不必要的日誌寫入磁盤操作。

innodb_log_buffer_size=10M

四,mysql併發參數調整

在Mysql中,控制併發連接和線程的主要參數包括 max_connections,back_log,thread_cache_size,table_open_cahce,innodb_lock_wait_timeout。

1,max_connections

​ 採用max_connections 控制允許連接到MySQL數據庫的最大數量,默認值是 151

​ Mysql 最大可支持的連接數,取決於很多因素,包括給定操作系統平臺的線程庫的質量、內存大小、每個連接的負荷、CPU的處理速度,期望的響應時間等。

2,back_log

back_log 參數控制MySQL監聽TCP端口時設置的積壓請求棧大小,如果MySql的連接數達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源,將會報錯

3, table_open_cache

該參數用來控制所有SQL語句執行線程可打開表緩存的數量

4,thread_cache_size

該參數用來控制 MySQL 緩存客戶服務線程的數量

5,innodb_lock_wait_timeout

該參數是用來設置InnoDB 事務等待行鎖的時間,默認值是50ms ,對於需要快速反饋的業務系統來說,可以將行鎖的等待時間調小,以避免事務長時間掛起; 對於後臺運行的批量處理程序來說, 可以將行鎖的等待時間調大, 以避免發生大的回滾操作。

該參數用來控制 MySQL 緩存客戶服務線程的數量

5,innodb_lock_wait_timeout

該參數是用來設置InnoDB 事務等待行鎖的時間,默認值是50ms ,對於需要快速反饋的業務系統來說,可以將行鎖的等待時間調小,以避免事務長時間掛起; 對於後臺運行的批量處理程序來說, 可以將行鎖的等待時間調大, 以避免發生大的回滾操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章