MySQL是目前常用的RDBMS(RelationalDatabaseManagementSystem/關系數據庫管理系統),還有其他如PostgreSQL,Oracle,DB2等關系數據庫管理系統。而數據庫性能的重要性無需強調,在這裡簡單說一下,安裝MySQL之後的優化相關的話題。
計算MySQL使用內存
首先確認一下,計算MySQL進程占用內存的方法。
MySQL占用內存 = 全局緩存 + ( 線程緩存 x 最大連接數 )
全局緩存的占用內存,用以下方法計算。
max_heap_table_size參數不一定分配內存,在這裡為了安全也計算到全局緩存。
全局緩存 = key_buffer_size
+ innodb_buffer_pool_size
+ innodb_additional_mem_pool_size
+ innodb_log_buffer_size
+ max_heap_table_size
+ query_cache_size
線程緩存的占用內存,用以下方法計算。
在通常查詢中myisam_sort_buffer_size使用的可能性很小,因此沒有計算到線程緩存。並且在這裡把max_allowed_packet計算在線程緩存裡,如果接傳送的數據量不大的話,可使用net_buffer_length進行計算。
線程緩存 = sort_buffer_size
+ read_rnd_buffer_size
+ join_buffer_size
+ read_buffer_size
+ max_allowed_packet
+ thread_stack
MySQL緩存
如何使用緩存對MySQL的性能表現至關重要,MySQL有以下2種緩存。
全局緩存(Global Cache)
線程緩存(Thread Cache)
全局緩存
innodb_buffer_pool_size
緩存InnoDB的索引及數據
使用InnoDB時至關重要的參數
innodb_additional_mem_pool_size
InnoDB存儲的數據目錄信息及內部數據結構
不足時往MySQL錯誤日志文件輸出警告(Warning)
使用默認值,查看MySQL錯誤日志文件不足時再增加
innodb_log_buffer_size
InnoDB事務日志使用的緩沖區
事務結束或者一定間隔將緩存區的日志寫到文件(同步到磁盤)
盡量給其他參數多配置內存
key_buffer_size
緩存MyISAM的索引
query_cache_size
緩存查詢(SELECT)的結果
對MySQL性能有直接影響
query_cache_type參數可改變MySQL緩存行為
線程緩存
sort_buffer_size
ORDER BY,GROUP BY時使用區域
根據程序的使用情況進行配置
read_rnd_buffer_size
讀取排序後數據時使用
提高ORDER BY性能
join_buffer_size
進行表結合時,如沒有使用索引的話使用該區域
表結合推薦使用索引,所以該參數無需配置的過大
read_buffer_size
讀取全表時的使用區域
不使用索引的查詢是,不應該使用的因此該參數無需配置的過大
myisam_sort_buffer_size
MyISAM的DDL(DataDefinitionLanguage)的索引排序時使用的區域
通常查詢不會使用該區域,因此默認就可以
max_allowed_packet
數據包發送緩沖區是存儲接傳送數據包的內存區域
被net_buffer_length參數初期化,根據需要擴張到max_allowed_packe指定的大小
內存以外的參數
max_connections
可連接MySQL數據庫的最大連接數
默認是151
innodb_lof_file_size
保存InnoDB更新日志到磁盤
innodb_log_file已滿時,innodb_buffer_pool更新日志寫入磁盤
調整innodb_buffer_pool_size時,innodb_log_file_size也需調整
調整的越大Crash Recovery的時間也會跟著變長
table_open_cache
保存使用表(Table)的文件指針
至少需要「同時連接數 x Table數」
MyISAM是一個表(Table)需要2個文件指針
注意OS限制 ※cat /proc/sys/fs/file-max
thread_cache_size
通過緩存線程(Thread),降低連接時的負荷
根據實際的負荷進行配置