Mysql優化-典型的服務器配置

 

內存配置相關參數 mysql

 

  mysql內存分配須要考慮到操做系統須要使用的內存,其餘應用程序所要使用的內存,mysql的會話數以及每一個會話使用的內存,而後就是操做系統實例所使用的內存。生產環境的mysql每每都是一個實例獨佔一個服務,所以,mysql實例須要考慮 mysql 的會話數,會話內存以及實例內存。sql

 

  會話內存參數會爲每個鏈接的會話分配對應大小的內存,相關的主要參數有以下幾個:數據庫

  sort_buffer_size:會話發送的語句須要進行排序時就會一次性分配對應的大小的緩存緩存

  join_buffer_size:應用程序常常會出現一些兩表(或多表)join 的操做需求,Mysql 在完成某些 join 需求的時候(all / index join),爲了減小參與 join 的「被驅動表」的讀取次數以提升性能,須要使用到 join buffer 來協助完成 join 操做。當 join buffer 過小,mysql 不會將該 buffer 存入磁盤文件,而是先將 join buffer 中的結果集與須要 join 的表進行 join 操做,而後清空 join buffer 中的數據,繼續將剩餘的結果集寫入此 buffer 中,如此往復,會形成驅動表須要被屢次讀取,成倍增長 IO 訪問,下降效率。安全

  read_buffer_size:mysql讀入緩衝區的大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,mysql 會爲他分配一段內存緩衝區。read_buffer_size 變量控制這一緩衝區的大小。若是對錶的順序掃描請求很是頻繁,而且你認爲頻繁掃描進行的太慢,能夠經過增長該變量以及內存緩衝區大小提升其性能。服務器

  read_rnd_buffer_size:mysql 的隨機讀取緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,mysql 會首先掃描一遍該緩衝,以免磁盤搜索,提升查詢速度,若是須要排序大量數據,可適當調高該值。但 mysql 會爲每一個客戶鏈接發放該緩衝空間,因此應儘可能適當設置該值,以免內存開銷過大。async

  Innodb_buffer_size:InnoDB 使用該參數指定大小的內存來緩衝數據和索引,這個是 InnoDB引擎中影響性能最大的參數性能

  key_buffer_size:myisam 決定索引處理的速度,尤爲是索引讀的速度。默認是 16M,經過檢查狀態值 key_read_requests(從緩存讀取索引的請求次數) 和 key_reads(從磁盤讀取索引請求次數),能夠知道 key_buffer_size 設置是否合理。比例 key_reads / key_read_requests 應該儘量的低,至少是 1:100,1:1000 更好(SHOW STATUS LIKE 'key_read%')。key_buffer_size 只對 MyIsam 表起做用。即便你不使用 MyIsam 表,可是內部的臨時磁盤表是 MyIsam 表,也要使用該值。設置該值大小能夠經過以下語句獲取。spa

  select sum(index_length) from information_schema.tables where engine='myisam';操作系統

 

IO相關配置參數

  innodb 相關參數

  innodb_log_file_size:這個值設置 redo log 文件的大小

  innodb_log_files_in_group:這個值設置 redo log 文件的個數

  innodb_log_buffer_size:redo log 緩存池的大小

  innodb_flush_log_at_trx_commit:這個參數設置了 mysql redo log 刷新到日誌文件的方式。該參數設置有如下三個值:

  0:每隔一秒 mysql 將 redo log buffer 中的數據刷新到操做系統 cache中,並刷新到磁盤中,可是事務提交併不會引發任何操做。這樣會至少丟失1秒鐘的數據。

  1:在每次事務提交時執行 log 寫入 cache,並將數據刷新到磁盤(系統默認)

  2:事務提交時會將數據刷新到操做系統的cache中,可是並不會引發數據刷新到磁盤中,該模式下,mysql會每秒執行一次刷新到磁盤操做,這樣在系統崩潰時有可能形成 1s 的數據丟失。

  當設置爲0,該模式速度最快,可是不太安全,mysqld 進程崩潰會致使上一秒全部事務數據的丟失。設置爲1,該模式最安全,但也是最慢的一種方式。在mysqld服務器崩潰或者服務器主機 crash的狀況下,binary log只有可能丟失最多一個語句或者一個事務。設置爲2,該模式速度較快,也比0安全,只有在操做系統崩潰或者系統斷電的狀況下,上一秒數據纔會丟失(介於0,1之間)

  innodb_flush_method:這個參數控制着 innodb 數據文件及 redo log的打開、刷寫模式。有三個值:fdatasync(默認,調用 fsync() 去刷數據文件redo log的buffer)、O_DSYNC、O_DIRECT

  innodb_double_write:雙寫緩存,用來緩存保護數據避免寫數據塊時形成數據塊損壞

 

  MyIsam相關參數

  delay_key_write:指在表關閉以前,將對錶的 update 操做只更新數據到磁盤,而不更新索引到磁盤,把對索引的更改記錄在內存

 

安全相關配置參數

  expire_log_days:指定二進制日誌保留的天數

  skip_name_resolve:禁用DNS查找

  read_only:將數據庫設置爲只讀模式

  skip_slave_start:mysql啓動後不會啓動主從複製

 

其餘配置

  sync_binlog:同步二進制日誌的頻率,設置0的表示 mysql 不控制 bin log的刷新, bin log 日誌刷新到磁盤徹底依賴於文件的操做系統,這時候的性能是最好的,可是風險也是最大的。當設置爲 n 時,指每一個 N 次操做時進行磁盤同步,這裏將磁盤設置爲1是最安全的設置,可是刷新的頻率太高對 IO 的影響也很是大。

  tmp_table_size:規定了內部內存臨時表的最大值,每一個線程都要分配,若是內存臨時表超出了限制,mysql 就會自動地把它轉化爲基於磁盤的 MyIsam表,存儲在指定的 tmpdir 目錄下

  max_heap_table_size:這個變量定義了用戶能夠建立的內存表(memory table)的大小,這個值用來計算內存表的最大行數值。這個變量支持動態改變,即 set @max_heap_table_size = xxx,可是對於已經存在的內存表就沒有什麼用,除非這個表被從新建立或者修改或者 truncate table,服務重啓也會設置已經存在的內存表爲全局 max_heap_table_size 的值。這個參數和 tmp_table_size 一塊兒限制了內部內存表的大小

  max_connections:設置 mysql 會話鏈接的最大值

相關文章
相關標籤/搜索