雖然已經使用MySQL5.6版本有一段時間了,但因爲沒有和以前的版本做過詳細比較,因此對於哪些重要的或者不過重要的特性是在新版本中引入的,還有哪些特性已經或者將要從舊版本中移除的並無一個十分全面的瞭解。最近有一個將某數據庫實例由5.5升級爲5.6的需求,因此對於MySQL5.6和5.5版本之間的差別作了一個簡單梳理。
新增
Security improvements.
可以使用mysql_config_editor將登錄認證信息以加密方式保存在.mylogin.cnf文件中,客戶端可從該文件讀取以免以明文方式使用登陸信息。
經過內置sha256_password認證插件支持更強的帳戶密碼加密。
mysql.user表新增password_expired用以標識密碼是否過時。可經過alter user語句設置密碼過時。
經過 validate_password 插件實現密碼安全度檢查。
對於使用MySQL4.1以前版本的Hash方法加密的帳戶密碼mysql_upgrade 會給出警告。
在Unix平臺上mysql_install_db支持--random-passwords,可爲初始root用戶生成強度更高的密碼並設置密碼過時、移除匿名用戶。
各種日誌(慢查詢、二進制日誌、通用日誌)包括mysql客戶端命令歷史記錄中再也不會出現明文密碼內容。
START SLVAE語法改進可在該語句中指定鏈接MASTER的參數,可避免將密碼之類的信息保存在master.info文件
Changes to server defaults.
提供更好的性能並減小管理員對設置的手工修改
InnoDB enhancements.
開始支持全文索引。
Online DDL(即一些ALTER TABLE操做無需拷貝表、不阻塞增刪改)。
CREATE TABLE語句支持DATA DIRECTORY='directory' 可將file-per-table 下每一個表對應的.ibd文件存放在數據目錄之外的其餘目錄,提高了靈活性繼而可提高性能,好比將.ibd放在單獨的SSD盤。
支持transportable tablespaces、容許單表空間(每一個表的.ibd文件)動態導入導出。 FLUSH TABLE的FOR EXPORT從句可將buffer中未保存的變化刷到.ibd文件。以後可將.ibd文件拷貝和元數據文件拷貝至其餘服務器實例(如SSD、HDD)。ALTER TABLE的DISCARD TABLESPACE和IMPORT TABLESPACE從句可將數據載入不一樣的MySQL實例。
可經過innodb_page_size設置InnoDB頁大小(默認16KB可設置爲8KB、4KB)以適應特定的負載和硬件來下降冗餘、提高系能。
Buffer Pool刷新算法得以改進以加強性能和併發性,可經過一系列參數進行調整。
與memcached整合可以使用NoSQL-style API來訪問數據避免解析和構建查詢計劃的開銷(適用於簡單查詢、更新等)。
優化用的統計信息更加精確且可在服務重啓後保持並可控制採樣率。
優化只讀事務對於ad-hoc queries和report-generating 應用提高了性能和併發。
可將InnoDB undo log 從系統表空間移至一個或多個獨立表空間(如移動到SSD盤)。
可經過 innodb_checksum_algorithm=crc32指定使用更快的checksum算法。
redo log文件總大小可達到512G(以前爲4G),經過innodb_log_file_size指定單個文件大小,innodb_log_files_in_group指定文件數量、innodb_log_group_home_dir指定存放路徑。
可將MySQL中InnoDB表配置爲只讀模式(經過--innodb-read-only),這樣可在只讀媒介如DVD、CD上訪問InnoDB表或者搭建多實例共享數據目錄的數據倉庫。
可經過innodb_compression_level指定InnoDB compressed表的壓縮級別並經過innodb_log_compressed_pages指定是否將buffer pool中compressed pages因爲更新操做引發的re-compressed pages存儲在redo log中。
可經過innodb_compression_failure_threshold_pct, innodb_compression_pad_pct_max動態調整InnoDB壓縮表中的填充塊(用以免DML時的從新壓縮,但數量過多時會增長壓縮失敗的概率)的比例,以下降壓縮失敗率而無需經過新的參數重建表或者以不一樣的頁大小重建整個實例。
INFORMATION_SCHEMA中新增InnoDB相關係統表,可查詢InnoDB buffer pool、表元數據、索引、外鍵、底層性能相關的數據等。
新的InnoDB可使用LRU算法釋放打開的表所佔用的內存以緩解有大量表的服務器上的內存負載。(可經過 table_definition_cache 調整打開的InnoDB表可以使用的內存量)
內部性能優化,如經過拆分kernel mutex減小爭用、將flush操做由主線程移至獨立線程、使用多個刷新線程、較少大內存系統上的buffer pool的爭用。
更快的死鎖檢測算法,InnoDB相關的死鎖信息會所有寫入錯誤日誌。
可在服務器重啓後當即重載頁至InnoDB buffer pool以免重啓後過長的「熱身」時間,尤爲是InnoDB buffer pool較大的實例。可在服務器關閉時dump出buffer pool中的數據下次重啓後載入、也能夠在運行過程當中導入導出。
5.6.16後innochecksum可支持2G以上的文件
可經過innodb_status_output和innodb_status_output_locks,分別動態開閉InnoDB Monitor和InnoDB Lock Monitor(分別會在error log中打印出InnoDB相關信息,後一個參數的開啓要之前一個參數的開啓爲前提,之後後一個參數的結果是前一個結果的子集)。
5.6.17後可使用online DDL(ALGORITHM=INPLACE)經過以下操做OPTIMIZE TABLE、ALTER TABLE ... FORCE、ALTER TABLE ... ENGINE=INNODB 來重建表,以減小重建時間並容許併發的DML。
Partitioning.
分區最大量可達8192(包含子分區的量)
可以使用ALTER TABLE ... EXCHANGE PARTITION與非分區表交換分區表的一個分區或子分區(前提是這兩個表除了分區以外表結構一致、且非分區的表不爲臨時表且無外鍵引用或被引用的外鍵非分區表中不包含要交換的分區邊界之外的值)
能夠限定在一個或者多個分區或子分區內查詢。支持的語句包括SELECT、DELETE、INSERT、REPLACE、UPDATE、LOAD DATA、LOAD XML。
Partition lock pruning經過消除分區上的鎖,極大提高了多分區表上DML、DDL操做的性能。
Performance Schema.
更加豐富的信息。表輸入輸出,表事件過濾,線程事件過濾,表、索引I/O及表鎖摘要信息,語句及語句的階段信息等。相關的兩個參數爲 --gtid-mode和--enforce-gtid-consistency。若使用GTIDs在開始一個新的slave或者指向一個新的master時就沒必要指定日誌文件和文件中的位置,過程可大大簡化。另外,因基於GTID的複製時徹底基於事務的,於是很容易檢查主從一致性,只要master上提交的事務在slave上也提交過就能夠保證一致。
Replication and logging.
開始支持使用GTIDs( global transaction identifiers)的基於事務的複製,使識別和追蹤在master上提交併在slave上應用的每一個事務成爲可能。
可經過binlog_row_image控制 row-based複製中的row image所包含的列,使其能夠包含全部列或者不包含BLOB和TEXT列或者僅包含必要的用於惟一標識並執行每一行上的變化的個別列,以便於節省磁盤開銷、網絡開銷和內存使用。
MySQL Server 對二進制日誌的讀寫是 crash-safe的,因只記錄和讀取完整的事務/事件。默認,會記錄事件自己和事件的長度,而後利用這些信息驗證事件是否被正確書寫。也能夠經過binlog_checksum 變量使server使用CRC32算法爲事件寫校驗和,並經過 master_verify_checksum使server從日誌文件中讀取校驗和, --slave-sql-verify-checksum 可使slave的SQL thread從中繼日誌中讀取校驗和。
支持選擇將master的鏈接信息以及slave的中繼日誌信息保存在文件或者表中,相關參數爲--master-info-repository和--relay-log-info-repository。但爲了保證複製的crash-safe,當選擇將master的鏈接信息以及slave的中繼日誌信息保存在表中時相關的表必須是事務性引擎如InnoDB(5.6.6以後的版本會自動建立爲InnoDB表但以前的版本會建立MyISAM表,所以在複製開始以前必定要修改成InnoDB引擎)
mysqlbinlog工具能夠從指定的主機以原始的二進制格式備份二進制日誌文件。工具相關的命令行參數爲 --read-from-remote-server和--raw
支持延遲複製,也即,將slave延後於master一段特定的時間。改特性能夠用於測試延遲帶來的影響或者挽救 DBA在master上不當心犯的錯誤(經過CHANGE MASTER TO中的MASTER_DELAY指定)。
對於有多塊網絡接口的salve機器可指定只使用其中某一個(經過CHANGE MASTER TO 語句中的 MASTER_BIND指定)
新增log_bin_basename參數用於指定二進制日誌文件完整的路徑和文件名
支持slave上多個線程並行執行master上傳遞下來的事務。經過 slave_parallel_workers指定slave上併發執行事務的worker數量。這種併發是基於數據庫的,也即數據庫內的操做是有前後順序的,主從上需以一致的順序執行,但不一樣數據庫之間則不須要這種順序,也即一個worker可沒必要等待其餘worker在更新完某個庫以後再更新某庫。
Optimizer enhancements.
優化了SELECT ... FROM single_table ... ORDER BY non_index_column [DESC] LIMIT [M,]N;查詢性能
實現了Disk-Sweep Multi-Range Read.有效減小了在大表且沒有緩存在緩存中的狀況下在輔助索引上範圍掃描形成的隨機磁盤訪問。採用的辦法是先掃描找出相關行關聯的key,而後依據主鍵將key排序,最終依據排好序的key回表取出數據。
實現了ICP(Index Comndition Pushdowndown)。若沒有ICP,存數引擎層根據索引定位表中的行並返回給Server層而後在這裏用WHERE從句中的條件對結果進行過濾。若使用ICP,若是WHERE條件中的部分列可由索引中的字段進行評估那麼server層會將WHERE條件中的這一部分下推到存儲引擎層。引擎層進行評估後只取出知足要求的行。這樣可有效減小引擎訪問表的次數和server訪問引擎的次數。
EXPLAIN支持 DELETE, INSERT, REPLACE和UPDATE,之前只支持SELECT,且能夠以JSON格式輸出。
處理FROM從句中的子查詢(派生表)更加高效。首先FROM後的子查詢的物化過程直到查詢執行時須要這一部分的內容時才進行,另外查詢可能會在派生表上加索引以加快查詢。
使用semi-join和物化策略優化子查詢。
使用BKA(Batched Key Access)join算法提高join性能。支持inner join、outer join、semi-join、nested outer joins和nested semi-joins。
新增tracing功能主要供開發者使用。經過一些列 optimizer_trace_xxx 變量和 INFORMATION_SCHEMA.OPTIMIZER_TRACE來提供
Condition handling.
可經過GET DIAGNOSTICS語句獲取各類診斷信息
Data types.
對於TIME、DATETIME、TIMESTAMP類型的值支持小數的秒,最多可支持毫秒級別(也即6位的精度)。
以前的版本中每一個表至多隻有一個TIMESTAMP列能夠初始化爲當天日期時間(DEFAULT CURRENT_TIMESTAMP)或者更新至當天日期時間( ON UPDATE CURRENT_TIMESTAMP)。新版本的中取消了此限制.另外,以前只有TIMESTAMP列可使用DEFAULT CURRENT_TIMESTAMP和 ON UPDATE CURRENT_TIMESTAMP,如今datetime列也能夠。
以前版本中TIMESTAMP列定義中什麼都不指定的話自動的默認爲DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。如今能夠經過 explicit_defaults_for_timestamp 變量關閉這一行爲。
Host cache.
提供了更多有關致使鏈接錯誤的緣由的信息以及對host cache訪問的改進,其中包含客戶端IP和主機名可用以免DNS查詢。具體實現以下:
增長了一系列 Connection_errors_xxx狀態變量,提供有關鏈接錯誤的信息,這些信息是全局的表示全部鏈接的各種錯誤信息的聚合,不是針對於某個特定IP地址。
performance_schema庫新增host_cache表且有更多的關於錯誤信息的計數字段來track各種錯誤(非針對特定IP的錯誤),這樣一來即可經過查詢該表得知有多少主機被緩存、哪些主機發生了哪類錯誤、鏈接錯誤量有多接近max_connect_errors限制。
可經過 host_cache_size調整host cache大小
OpenGIS.
原生實現了OPENGIS規範定義的測量兩個幾何值之間關係的一系列函數。
降級
ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE和NO_ZERO_IN_DATE 幾個sql mode 不同意使用,MySQL5.7中這些值不會有任何影響,效果會被包含在strict SQL mode中((STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES)。MySQL升級時要注意這些問題。確保新版本中的SQL MODE不會影響應用。
GROUP BY中的隱式排序不同意使用,這屬於有MySQL的一個擴展,可能在未來版本中出於性能考慮被移除。因此最好使用ORDER BY語句明確指明排序。
不推薦使用4.1以前版本的密碼和mysql_old_password認證插件,不安全。爲防止使用舊版本密碼哈希可將secure_auth 開啓。對於DBA 建議將使用mysql_old_password 認證插件的帳戶轉爲使用 mysql_native_password認證插件。
不建議使用OLD_PASSWORD()和old_passwords=1來生成4.1版本以前的密碼。
不建議使用 --skip-innodb或者--innodb=OFF, --disable-innodb;date_format, datetime_format 和 time_format; have_profiling, profiling 和 profiling_history_size ; innodb_use_sys_malloc 和innodb_additional_mem_pool_size; timed_mutexes 變量。這些均可能在未來的版本中移除。
使用 --lc-messages-dir 和 --lc-messages 代替--language(用於指明錯誤信息使用的語言)。
不建議使用 ALTER IGNORE TABLE。
不建議使用 msql2mysql, mysql_convert_table_format, mysql_find_rows, mysql_fix_extensions, mysql_setpermission, mysql_waitpid, mysql_zap, mysqlaccess 和 mysqlbug這些工具。
不建議使用mysqlhotcopy工具。
移除
--log選項,使用 --general_log 和 --general_log_file=file_name 代替。
--log-slow-queries 選項。使用 --slow_query_log以及 --slow_query_log_file=file_name 代替。
--one-thread選項。用 --thread_handling=no-threads 代替。
--safe-mode。
--skip-thread-priority。
--table-cache。使用table_oopen_cache變量代替。
移除--init-rpl-role、--rpl-recovery-rank options選項, 和rpl_recovery_rank、Rpl_status狀態變量。
取消engine_condition_pushdown 變量,改成optimizer_switch變量中的一個flag engine_condition_pushdown。
取消have_csv, have_innodb, have_ndbcluster和have_partitioning變量。使用SHOW PLUGIN或者查詢INFORMATION——SCHEMA中的PLUGINS表。
sql_big_tables變量替換爲big_tables.
sql_low_priority_updates變量替換爲low_priority_updates.
sql_max_join_size變量替換爲max_join_size.
max_log_data_size變量替換爲max_allowed_packet。
FLUSH MASTER和FLUSH SLAVE語句替換爲 RESET MASTER和 RESET SLAVE.
SLAVE START和SLAVE STOP替換爲START SLAVE和STOP SLAVE。
取消SHOW AUTHORS和SHOW CONTRIBUTORS.
取消SET 命令中的OPTION和ONE_SHOT修飾符。
不容許加在存儲過程、存儲函數中將參數或者本地變量設置爲DEFAULT( SET var_name = DEFAULT ).但能夠將系統變量設置爲DEFAULT。
移除 SHOW ENGINE INNODB MUTEX。
轉載:http://blog.csdn.net/zyz511919766/article/details/49865091