以下羅列了我所感興趣的mysql5.6新參數,不定期更新本文,完善參數的說明,先大概列一下,做簡單說明,以後在一個個補上
///////////////////////////////////////////////
table_open_cache_instances #對table cache進行劃分,減少鎖競争
metadata_locks_hash_instances # 對server層的metalock hash進行劃分,
metadata_locks_cache_size# metadata lock cache的大小,這是總的大小,可以适當調大來提升并發度
relay_log_info_repository #是以檔案(file) 還是表(table)的方式記錄relaylog坐标資訊
master_info_repository # 是以檔案(file) 還是表(table)的方式記錄binlog資訊
gtid_mode # 設定為on,表示打開gtid,預設為off
enforce_gtid_consistency #如果設定該選項,則隻允許記錄事務安全的語句
gtid_next
gtid_owned
gtid_purged
gtid_executed
slave_parallel_workers #備庫複制worker線程數
slave_checkpoint_group #在并發複制時總共執行這麼多次事務後做一次checkpoint,更新show slave status的資料
slave_checkpoint_period #在複制執行這麼長時間後做一次checkpoint
slave_pending_jobs_size_max #在多線程複制時,在隊列中pending的事件所占用的最大記憶體,預設為16m,如果記憶體富餘,或者延遲較大時,可以适當調大;注意這個值要比主庫的max_allowed_packet大
binlog_checksum #
binlog_max_flush_queue_time #
binlog_order_commits #
binlog_row_image
binlog_rows_query_log_events #
innodb_buffer_pool_dump_at_shutdown #shutdown時導出bp中的pageno
innodb_buffer_pool_load_at_startup #啟動時讀入之前導出的bp中的page
innodb_flush_method = o_direct_no_fsync #新參數,在io時使用o_direct,但不再随後做fsync,可以參考bug#45892的描述;這種配置不适合一些檔案系統,因為metadata沒有被fsync到磁盤。
innodb_lru_scan_depth #影響page cleaner線程一次掃描lru/unzip_lru的深度,預設為1024,io有空餘可以适當調大;
innodb_adaptive_flushing_lwm #該值表示redo log的一個最低容量限制百分比,預設為10,當沒有達到這個值時,則不會page cleaner線程不會根據redo來判斷是否刷頁,細節見函數af_get_pct_for_lsn
innodb_max_dirty_pages_pct_lwm #防止在到達innodb_max_dirty_pages_pct時瘋狂重新整理,而是在達到這樣一個限定值時,開始“優雅”的做重新整理髒頁(預重新整理)。詳細見函數af_get_pct_for_dirty
innodb_io_capacity_max #當flush操作落後太多時,可能會做一些非常有侵略性的重新整理(超過指定的innodb_io_capacity),這會影響到正常的業務,指定這個值,可以限制io capacity的上限,減少對正常應用的影響
innodb_flushing_avg_loops #這個選項可以控制adaptive flush對工作負載變化的響應速度。在這麼多次loop内,innodb會保持上次的重新整理狀态快照不變,增加這個值有助于重新整理操作更加平穩,而減小這個值有助于對工作負載的變化更快的調整adaptive flush,不過,如果設定的過小的話,在突然增大/減小的工作的負載中,容易引起性能尖峰。
從innodb核心層面來看,以上三個參數實際上影響了page cleaner線程重新整理的髒頁的數量。
刷髒頁可以由兩個因素影響:
1. 根據redo log計算比例(pct_for_lsn),當小于innodb_adaptive_flushing_lwm時,pct_for_lsn值為0,當小于異步刷redo的比例(log_sys->max_modified_age_async)時且關閉選項innodb_adaptive_flushing時,pct_for_lsn也為0,否則,計算:
((innodb_io_capacity_max/innodb_io_capacity)
*(lsn_age_factor * sqrt((double)lsn_age_factor)))/7.5
其中lsn_age_factor為目前的(redo比例*100)/max_modified_age_async
2. 根據髒頁計算比例(pct_for_dirty),當innodb_max_dirty_pages_pct_lwm設定為0時,和以前的行為類似,如果髒頁比例大于innodb_max_dirty_pages_pct時,pct_for_dirty設定為100,否則如果髒頁比大于innodb_max_dirty_pages_pct_lwm,pct_for_dirty值為
(dirty_pct * 100)/( innodb_max_dirty_pages_pct+1)
3. 最近innodb_flushing_avg_loops次平均刷髒頁的數量,同時還考慮上次統計時候的平均數量,再除以2
avg_page_rate= ((sum_pages / srv_flushing_avg_loops) + avg_page_rate) / 2
另外也會計算lsn的重新整理速率
lsn_rate= (cur_lsn – prev_lsn) / srv_flushing_avg_loops;
lsn_avg_rate= (lsn_avg_rate + lsn_rate) / 2;
然後根據上述兩個值計算要重新整理的page數:
pct_total = ut_max(pct_for_dirty, pct_for_lsn);
n_pages = (pct_io(pct_total) + avg_page_rate) / 2;
if (n_pages > srv_max_io_capacity) {
n_pages =srv_max_io_capacity;
}
除了髒頁的數量外,還要确定一個lsn下限值(lsn_limit),oldest_modification小于lsn_limit的block需要被重新整理掉,其計算方式也受參數innodb_flushing_avg_loops影響:
每innodb_flushing_avg_loops次循環,計算
lsn_rate = (cur_lsn – prev_lsn) /srv_flushing_avg_loops;
lsn_avg_rate = (lsn_avg_rate + lsn_rate) / 2;
lsn_avg_rate表示lsn最近的平均推進速率
然後計算lsn_limit:
if (last_pages && cur_lsn – last_lsn >lsn_avg_rate / 2) {
age_factor= prev_pages / last_pages;
lsn_limit = oldest_lsn + lsn_avg_rate * (age_factor +1)
prev_pages表示上一次重新整理時,試圖刷的page數,last_pages表示上次實際重新整理的page數,age_factor總是大于等于1的。
oldest_lsn表示目前bp中的最老lsn.
在确定了需要重新整理的page數及哪些page需要被重新整理後,就可以調用函數page_cleaner_do_flush_batch->buf_flush_list做實際的操作了。
innodb_flush_log_at_timeout #每隔這麼多秒刷一次日志,隻有在innodb_flush_log_at_trx_commit=2時才生效.在master線程中判斷,見函數srv_sync_log_buffer_in_background,在兩個函數中會調用:
1.srv_master_do_active_tasks
2.srv_master_do_idle_tasks
從命名也可以了解,master線程在系統繁忙及空閑時,都會去做判斷。在5.6的master線程函數srv_master_thread中,每sleep 1秒,會根據目前的系統負載是否繁忙去調用上面這兩個函數,相比之前的函數,master線程函數要清爽很多了。每隔innodb_flush_log_at_timeout秒,會調用log_buffer_sync_in_background(true)去刷日志。
innodb_print_all_deadlocks #儲存全部死鎖資訊
innodb_adaptive_max_sleep_delay #表示在使用automic進行進入innodb層并發控制時的自适應sleep時間的最大值
innodb_purge_threads # purge線程數,可以加快purge速度
innodb_online_alter_log_max_size #在做online ddl時,保持增量更新的日志緩沖區的最大值;如果超過這個值,所有未送出的事務復原,alter table操作失敗
innodb_sort_buffer_size #在建立index時做歸并排序時每個歸并塊值,适當調大可以加快建索引速度,同時這個值也是在做online ddl時增量日志緩沖每次擴充的大小。
innodb_read_only #設定該參數可以在隻讀媒介上啟動innodb,這也意味着我們可以開啟多個執行個體,對同一份資料集做純讀操作…
innodb_log_file_size #1mb ~ 1/log_group*bp, 48g bp& 4 instance的話,12gb為上限過大的值不相容
default_tmp_storage_engine #設定臨時表使用的存儲引擎
innodb_stats_persistent #物化統計資訊,預設打開
innodb_stats_persistent_sample_pages #當打開innodb_stats_persistent選項時,這個設定才生效
innodb_stats_transient_sample_pages #當關閉innodb_stats_persistent選項時生效,采樣page數(尤其是後者)不應該設定的太大,否則會産生額外的io開銷,但也不應設定的太小,否則會導緻查詢計劃不準确
innodb_stats_auto_recalc #用于決定是否在表上存在大量更新時(超過10%的記錄更新)重新計算統計資訊。預設打開,如果關閉該選項,就需要在每次建立索引或者更改列之後,運作一次analyze table指令來更新統計資訊,否則可能選擇錯誤的執行計劃。同樣的,也可以在create table/alter table指令中指定stats_auto_recalc值
innodb_compression_level #定義壓縮表的壓縮級别,在具有較好壓縮特性的資料集上,可以适當調小該值,還獲得更好的tps性能
innodb_compression_failure_threshold_pct #該參數和下面的參數來自facebook對壓縮表的改進,當一個非壓縮page無法壓縮到指定size時,會産生索引分裂,這會大大影響性能,我們可以給非壓縮頁留一些空白,少存一點資料,這樣會降低壓縮失敗率,但也有可能減小壓縮比,該選項表示當壓縮失敗率高于這個值時,進行apdative padding.
innodb_compression_pad_pct_max #一個非壓縮page上最大允許留白的百分比
innodb_cmp_per_index_enabled #表示是否統計每個表的每個索引的壓縮狀态,如果打開,資訊會進行收集,并顯示在information_schema的innodb_cmp_per_index/innodb_cmp_per_index_reset中,這會有一定的性能損耗
#memcache_plugin
daemon_memcached_enable_binlog
daemon_memcached_engine_lib_name
daemon_memcached_engine_lib_path
daemon_memcached_option
daemon_memcached_r_batch_size
daemon_memcached_w_batch_size
innodb_undo_tablespaces #undo 表空間的個數,将所有的復原段平分到這麼多個ibd表空間檔案中,這個值一旦設定,則不可更改。配置這個及下面的選項,是為了将undolog從ibdata中獨立出來,并且由于undo log是随機寫,可以放到ssd盤上來提高性能
innodb_undo_directory #表示undo log表空間檔案的路徑,啟動前設定
innodb_undo_logs #等同于老版本的innodb_rollback_segments
innodb_checksum_algorithm #更快的checksum算法(crc32)