Mysql應用相關的優化以及內存管理

mysql的優化

參考

黑馬的mysql高級教程

一、應用層的優化

在實際生產環境中,由於數據庫本身的性能侷限,就必須要對前臺的應用進行一些優化,來降低數據庫的訪問壓力。

1. 使用連接池

對於訪問數據庫來說,建立連接的代價是比較昂貴的,因爲我們頻繁的創建關閉連接,是比較耗費資源的,我們有必要建立 數據庫連接池,以提高訪問的性能。

有很多實現方式,比如在java中就有很多,阿里的druid等

2. 減少對MySQL的訪問

(1)避免對數據進行重複檢索

在編寫應用代碼時,需要能夠理清對數據庫的訪問邏輯。能夠一次連接就獲取到結果的,就不用兩次連接,這樣可以大大減少對數據庫無用的重複請求。

(2)增加cache層

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

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

3. 負載均衡

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

  • 利用MySQL複製分流查詢
  • 採用分佈式數據庫架構

以上這些都是在應用架構方面考慮的性能優化,相當於在客戶端連接是的操作!

二、Mysql中查詢緩存優化

1. 緩存的概述

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

2. 操作流程

  • 客戶端發送一條查詢給服務器
  • 服務器先會檢查查詢緩存,如果命中了緩存,則立即返回存儲在緩存中的結果。否則進入下一階段;
  • 服務器端進行SQL解析、預處理,再由優化器生成對應的執行計劃;
  • MySQL根據優化器生成的執行計劃,調用存儲引擎的API來執行查詢;
  • 將結果返回給客戶端(這個時候如果開啓了緩存,會將該次查詢加入到緩存中)。

3. 查詢緩存配置

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

SHOW VARIABLES LIKE 'have_query_cache';	

在這裏插入圖片描述

(2). 查看當前MySQL是否開啓了查詢緩存 :

SHOW VARIABLES LIKE 'query_cache_type';

在這裏插入圖片描述
如果你的數據庫沒有開過緩存,這裏應該是OFF的

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

SHOW VARIABLES LIKE 'query_cache_size';

在這裏插入圖片描述
這是字節,如果自己電腦或者服務器內存較大的時候可以多分配一點,會提升很大的性能;

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

SHOW STATUS LIKE 'Qcache%';

在這裏插入圖片描述
下面是各參數的一些含義:

參數 含義
Qcache_free_blocks 查詢緩存中的可用內存塊數
Qcache_free_memory 查詢緩存的可用內存量
Qcache_hits 查詢緩存命中數
Qcache_inserts 添加到查詢緩存的查詢數
Qcache_lowmen_prunes 由於內存不足而從查詢緩存中刪除的查詢數
Qcache_not_cached 非緩存查詢的數量(由於 query_cache_type 設置而無法緩存或未緩存)
Qcache_queries_in_cache 查詢緩存中註冊的查詢數
Qcache_total_blocks 查詢緩存中的塊總數

4. 開啓緩存配置

MySQL的查詢緩存默認是關閉的,需要手動配置參數 query_cache_type , 來開啓查詢緩存。query_cache_type 該參數的可取值有三個 :

含義
OFF 或 0 查詢緩存功能關閉
ON 或 1 查詢緩存功能打開,SELECT的結果符合緩存條件即會緩存,否則,不予緩存,顯式指定 SQL_NO_CACHE,不予緩存
DEMAND 或 2 查詢緩存功能按需進行,顯式指定 SQL_CACHE 的SELECT語句纔會緩存;其它均不予緩存

在windows上的mysql,默認的是在:
在這裏插入圖片描述

然後加上mysqld下面加上:

query_cache_type=1;

然後重啓mysql的服務;我們可以測試一下:
在這裏插入圖片描述
這裏已經開了緩存,這條sql前面執行過一次,所以已經加入到緩存中了,後面的查詢0s左右;

然後在執行一條查詢所有角色的sql,再看看結果:
在這裏插入圖片描述
這裏可以發現 hits命中數並未增加,而這次是先將該次請求的結果放到了緩存中,所以 inserts增加了;

5. 緩存失效的情況

(1)SQL 語句不一致的情況

執行兩條語句:

SQL1 : select count(*) from test;
# 這裏的S是大寫
SQL2 : Select count(*) from test;

可以進行測試一下:
在這裏插入圖片描述
正常情況下:命中次數+1
在這裏插入圖片描述
這裏都不需要去查看緩存狀態,看查詢時間就知道沒有從緩存中拿數據;所以失效了;

(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) 查詢數據庫自帶的一些庫

select * from information_schema.engines;

(5)在存儲的函數,觸發器或事件的主體內執行的查詢。

(6)執行更改操作

如果表更改,則使用該表的所有高速緩存查詢都將變爲無效並從高速緩存中刪除。這包括使用MERGE映射到已更改表的表的查詢。一個表可以被許多類型的語句,如被改變 INSERT, UPDATE, DELETE, TRUNCATE TABLE, ALTER TABLE, DROP TABLE,或 DROP DATABASE 。

在這裏插入圖片描述
這裏可以看到,插入一條數據之後 ,之後查詢的緩存都失效了;

三、Mysql內存管理及優化

1. 內存優化原則

1) 將盡量多的內存分配給MySQL做緩存,但要給操作系統和其他程序預留足夠內存。

2) MyISAM 存儲引擎的數據文件讀取依賴於操作系統自身的IO緩存,因此,如果有MyISAM表,就要預留更多的內存給操作系統做IO緩存。

3) 排序區、連接區等緩存是分配給每個數據庫會話(session)專用的,其默認值的設置要根據最大連接數合理分配,如果設置太大,不但浪費資源,而且在併發連接較高時會導致物理內存耗盡。

2. MyISAM 內存優化

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

(1)key_buffer_size

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

(2)read_buffer_size

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

(3)read_rnd_buffer_size

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

3. InnoDB 內存優化

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

(1)innodb_buffer_pool_size

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

(2)innodb_log_buffer_size

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

四、總結

這是一些常見的優化方法和一些常用的優化參數,謝謝大家閱讀!!互相學習!

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