內存配置相關參數
mysql內存分配需要考慮到操作系統需要使用的內存,其他應用程序所要使用的內存,mysql的會話數以及每個會話使用的內存,然后就是操作系統實例所使用的內存。生產環境的mysql往往都是一個實例獨占一個服務,因此,mysql實例需要考慮 mysql 的會話數,會話內存以及實例內存。
會話內存參數會為每一個連接的會話分配對應大小的內存,相關的主要參數有如下幾個:
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 會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大。
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 表,也要使用該值。設置該值大小可以通過如下語句獲取。
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 會話連接的最大值