優化MySQL Server相關參數學習筆記

優化MySQL Server相關參數

mysql數據頁大小一般是16K,操作系統IO數據頁大小一般是4KB。

innodb內存優化:

1、原則:將盡量多的內存分配做緩存,但要給操作系統和其他程序運行預留足夠的內存

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

 

3、innodb_buffer_pool_size:決定innodb存儲引擎表數據和索引數據的最大緩存區大小。同時爲數據塊和索引塊提供數據緩存。值越大緩存命中率越高。通過show variables like '%innodb_buffer_pool%';查看相關參數

+-------------------------------------+----------------+

| Variable_name | Value |

+-------------------------------------+----------------+

| innodb_buffer_pool_chunk_size | 134217728 |

| innodb_buffer_pool_dump_at_shutdown | ON |

| innodb_buffer_pool_dump_now | OFF |

| innodb_buffer_pool_dump_pct | 25 |

| innodb_buffer_pool_filename | ib_buffer_pool |

| innodb_buffer_pool_instances | 1 |

| innodb_buffer_pool_load_abort | OFF |

| innodb_buffer_pool_load_at_startup | ON |

| innodb_buffer_pool_load_now | OFF |

| innodb_buffer_pool_size | 134217728 |

+-------------------------------------+----------------+

4、在LRU sublist中,innodb_old_blocks_pct決定old sublist的比列,默認是37,在沒有大表掃描或是索引掃描的情況下,如果young/s值很低,就需要增大innodb_old_blocks_pct或是減小innodb_old_blocks_time

 

5、調整緩存池數量:innodb_buffer_pool_instances,對於較大的緩存池,可以適當增大此值。

 

6、innodb_max_dirty_pages_pct:控制緩存中髒頁(即內存數據頁和磁盤數據頁不一致時,稱這個內存頁爲髒頁)的比例,默認是75%,如果髒頁數量達到或是超過這個值時,innodb後臺線程開始將內存中的數據刷到磁盤(順序存儲)空間。當髒頁比例小於此值時,如果innodb_adaptive_flushing的設置爲true,innodb將根據函數buf_flush_get_desired_flush_rate返回的重做日誌產生速度來確定刷髒頁數量,在合併插入緩存時,innodb每次合併的頁數是0.05*innodb_io_capacity。如innodb_buffer_pool_wait_free的值增長較快,則說明innodb經常等待空閒緩存頁,如果無法增大緩存池,那麼應該將innodb_max_dirty_pages_pct調小,或將innodb_io_capacity調高,以加快髒頁的刷新。 innodb_flush_neighbors表示在刷髒頁時,是否將左右相鄰的髒頁一起寫入磁盤,並且可以蔓延也就是對於每個鄰居的數據頁和字相鄰的數據頁也是髒頁的話也會被一起刷,默認0

 

7、Innodb_log_buffer_size減少日誌寫磁盤操作,從而提高事務處理性能。就是redo log buffer的大小(內存)參見redo log部分。

 

8、Innodb_io_capacity磁盤系統的io能力,一定程度代表磁盤每秒io次數,默認200,決定一批刷新髒頁的數量。固態硬盤和陣列可適當增大此值。

 

9、thread_cache_size:控制mysql緩存客戶服務線程的數量可以通過threads_created/connections來衡量設置是否合適,值越接近1,則說明線程命中率低,考慮適當增加thread_cache_size值

 

10、max_conections:控制允許連接到mysql數據庫的了最大數量。默認200(5.6),151(5.7)

 

11、back_log:此參數控制監聽TCP端口時設置的積壓請求棧大小,5.6.6以前默認是50,以後默認值是50+(max_connections/5),但最大不能超過900,如果數據在較短時間內處理大量請求,可以適當增加此值

 

12、innodb_file_per_table=on, mysql innodb的獨立表空間和共享表空間,獨立表空間是把每個表的數據和表文件放在一起。共享表空間是所有庫的數據都放在ibdate1文件中,網上說這個文件你刪除數據,不會收縮,也就是說如果你這個文件有40G,你刪了表數據,這個文件還是40G,這就很恐怖了,所以我們換成獨立表空間。還有就是雖然說獨立,但個人覺得還真不是很徹底,我把那些文件複製到另一個庫裏面,只有表,沒有數據,所以不徹底啊!

 

定期分析表analyze table ,optimize table,analyze check optimize alter table 執行期都會鎖表。 通過設置innodb_file_per_table=1,每個表都會生成一個獨立的ibd文件,用於存儲表的數據和索引,在刪除大量數據後,可以通過alter table tablename engine=innodb回收不用的空間。

 

13、read_buffer_size和read_rnd_buffer_size:這兩個都是按session獨佔的,增大read_rnd_buffer_size和max_length_for_sort_data可以改善order by sql性能。

Max_length_for_sort_data大小決哪種(共兩種)排序算法,超過此值會使用磁盤臨時文件排序

Max_sort_length變量可以指定當用blob或text前綴排序時,這個前綴有多大

Sort_buffer_size默認是全局的,一旦排序mysql會立刻分配指定大小內存不管是否需要這麼大,可以查詢前增加,如下所示

set @@session.sort_buffer_size :=409600

#執行語句

Set @@session.sort_buffer_size :=default,

14、Join優化:適當增大Join_buffer_size可改善連接查詢性能

Sort buffer都是面向客戶服務線程分配的,如果設置過大可能造成內存浪費。甚至導致內存交換,尤其是join buffer 多表關聯的查詢還可能會分配多個join buffer,因此最好的策略是設置較小的全局join_buffer_size,而對需要做複雜連接操作的session單獨設置較大的join_buffer_size

 

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