作為 MySQL 5.5 和 5.6 效能比較的一部分,我研究了下兩個版本預設引數的差異,為了瞭解差異內容,我使用如下的 SQL 語句分別在 MySQL 5.5 和 5.6 版本進行查詢
讓我們來看看這些差異的配置中最重要的也是影響最大的部分:
performance_schema 在 MySQL 5.6 中預設是開啟的,但相關的很多引數相比 MySQL 5.5 卻是降低了,例如 performance_schema 自動調整到 445 個表和 224 執行緒,比 MySQL 5.5 低。儘管預設 max_connections 只是 150 ,比 200 還小。
innodb_stats_on_metadata 在 MySQL 5.6 預設關閉,使得 information_schema 的查詢速度快很多。
innodb_log_file_size – 預設值從 5MB 提升到 50MB,這是一個好的改變,雖然我覺得這個預設數值還可以再大些。對於寫負載高的情況下,預設配置的 MySQL 5.6 效能更好。
back_log 改動比較小,從 50 改為 80。如果系統每秒處理的連線數很高,還需要繼續提高這個配置的值。
open_files_limit 由原來的 1024 改為 5000
innodb_auto_extend_increment 由 8MB 改為 64MB,可幫助降低碎片。
max_connect_errors 從 10 改為 100,可降低潛在的連線堵塞,但還可以更高些。
sort_buffer_size 從 2M 將為 256K,這可避免小排序導致的資源浪費,但是對大的排序有負面的影響。
max_allowed_packet 從 1MB 改為 4MB 讓 MySQL 可處理更大的查詢。
join_buffer_size 從 128K 改為 256K,我覺得這個改動影響不大。
table_open_cache 從 400 提高到 2000,挺好!
innodb_buffer_pool_instances 從 1 改為 8,用於最佳化更高併發的負載。
query_cache_type 和 query_cache_size. The behavior is “no cache” by default still but it is achieved differently now. The query_cache_type is now off by default with default size of 1MB while in MySQL 5.5 and before it was “ON” by default with query cache size of 0 which makes it disabled. I wish query_cache_size though would be larger by default as value of 1M is too small to be practical if someone tries to enable it.
sql_mode has NO_ENGINE_SUBSTITUTION value by default which is good change as trying to create Innodb table but getting MyISAM because Innodb was disabled for some reason was very error prone gotcha. Note this is as far as MySQL 5.6 goes - STRICT_MODE and other safer behaviors are not enabled by default.
innodb_old_blocks_time 設定為 1000,很好的改變,預設掃描 InnoDB 緩衝池大小。
thread_cache_size 預設啟用,對很多連線和斷開連線操作的情況下有幫助。
sync_relay_log_info and sync_master_info 預設值有原來的 0 改為 10000. 該改動幾乎不會影響負載。
secure_auth 預設開啟,要求新的密碼握手,特別是阻止老的不安全的做法,很好!
innodb_concurrency_tickets has been increased from 500 to 5000. If you’re using innodb_thread_concurrency this will reduce overhead associated with grabbing and releasing innodb_thread_concurrency slot but will increase potential starvation of queued threads especially for IO bound workloads. Most users will not be affected though as innodb_thread_concurrency is 0 by default so this queuing feature is disabled.
innodb_purge_threads 預設為 1 ,使用專用的後臺 purge 執行緒,好!
innodb_open_files 由 300 改為 2000,好!
innodb_data_file_path got a small change with starting ibdata1 size raised from 10M to 12M. I’m not sure what is the purpose of this change but it is unlikely to have any practical meaning for users. Considering the default innodb_auto_extend_increment is 64 starting with 64M might have made more sense.
innodb_purge_patch_size 從 20 改為 300.
innodb_file_per_table 預設啟用,這個改變很大,而且很棒。特別是當你的表非常大的時候。
optimizer_switch is the catch all variable for a lot of optimizer options. I wonder why was not it implemented as number of different variables which would make more sense in my opinion. MySQL 5.6 adds a lot more optimizer switches which you can play with:
mysql [localhost] {msandbox} (test) > select * from var55 where variable_name='OPTIMIZER_SWITCH' \G *************************** 1. row *************************** VARIABLE_NAME: OPTIMIZER_SWITCH VARIABLE_VALUE: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on 1 row in set (0.00 sec) mysql [localhost] {msandbox} (test) > select * from var56 where variable_name='OPTIMIZER_SWITCH' \G *************************** 1. row *************************** VARIABLE_NAME: OPTIMIZER_SWITCH VARIABLE_VALUE: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on 1 row in set (0.00 sec)
總結: MySQL 5.6 對預設配置進行了一些微調,這些調整大多數都非常不錯。