找到一份合適的工做,就像在工做的八小時以內有了一個心儀的戀人。html
老張我呢,原來在上學那會兒,不是特別愛學習,本人長得呢也特別帥(如今作了技術惋惜了哈哈!)因此特招漂亮女孩的喜歡,固然本身也特別喜歡和她們談戀愛啦,那感受老甜蜜了呢。也算得上是情感專家。可是最後都沒啥好結果,弄得我從此都再也不相信愛情了。mysql
因而我開始反思本身,究竟是哪裏出了問題,剛開始談戀愛的時候,兩人都感受特別好,但是隨着時間地流逝,感情就特別容易出現裂痕。原來是有一種叫作新鮮感的東西,在做祟。新鮮感只是說在大家還不是很瞭解對方的狀況下才有的,時間一長,兩人之間都彼此太熟悉了,就缺失了愛情中須要的火花元素,化學反應一旦不在,天然任何一次戀愛的開始也就意味着是分手的倒計時。算法
那如何保持這種新鮮感呢,時間久了,情侶之間就只能說是保鮮,須要偶爾給對方一點小小的驚喜和浪漫。sql
生活中談戀愛是這樣,那研究技術也一樣如此。一沉不變的技術知識,時間長了,咱們都會以爲枯燥無味,索然無趣。須要新鮮的血液進入到咱們的神經中樞,激發咱們對於求知慾的渴望。數據庫
今兒跟你們梳理一下MySQL數據庫中 5.7這個版本的新特性,讓那些平時只顧着工做,沒時間去研究新知識的同窗,能夠看到數據庫的新功能,新特性,從此有利用應用到生產中,更便於咱們開展工做。讓咱們把這個戀愛談得更長久,更甜蜜。安全
目前互聯網公司,線上mysql用的最多的版本是mysql5.5,5.6,5.7。先看下三個版本的性能對比圖:bash
OLTP READ ONLY服務器
MySQL 5.7比MySQL5.6 快近似於2倍架構
比MySQL5.5快近似於3倍
併發
OLTP READ WRITE
MySQL5.7比MySQL5.6快近似於1.5倍
比MySQL5.5快近似於2.5倍
MySQL數據庫,在5這個版本上待了10年之久,server層沒有太大的變化,主要是存儲引擎層的改變。也就是目前最火的Innodb存儲引擎,不管從它的功能上、仍是性能上,都有所提升。
一. 先從Innodb角度介紹
Innodb的加強分爲三大部分:
1.功能提高
Online Alter table;
Innodb_buffer_pool online change;
原子寫特性的檢測;能夠關閉double_write
Innodb buffer pool dump
2.性能提高
Innodb臨時表的DDL性能提高;臨時表不須要再記錄redo log;
Read Only性能上面的提高;
page cleaner線程數量上的增長,提高innodb_page_cleaners的效率
3.其餘點提高
截斷undo特性;
支持分區表的Transportable Tablespaces功能
下面詳細逐一介紹
Online Alter table
MySQL 5.7支持重命名索引和修改varchar的大小,無需table-copy。這兩項操做在以前的版本中,都須要重建索引或表。適用於各引擎。
例如以下:
ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
但存在限制,即只支持0~255字節內的或者255以上字節間的增長,也就是說若從254增到256時不能使用INPLACE算法,必須使用COPY算法,否側報錯。這是由於0~255內的VARCHAR值須要一個額外的字節來編碼,而256以上的VARCHAR值須要兩個字節來編碼。另外使用INPLACE算法縮小VARCHAR的ALTER TABLE也是不支持的,必須用COPY算法。
官文可見:http://dev.mysql.com/doc/refman/5.7/en/alter-table.html
動態修改Buffer Pool
動態調整innodb_buffer_pool_size大小,且不會消耗過高的代價。新增配置參數innodb_buffer_pool_chunk_size用來設置chunk的大小,新引入chunk的概念,每一個chunk默認是128M,以及新增狀態參數Innodb_buffer_pool_resize_status用來監視buffer pool的resize過程。
TIPS:從小改到大基本對服務沒有什麼影響,從大到改到小,就是多了一步須要釋放內存,但能夠忽略到影響。
Innodb buffer pool dump
新增參數innodb_buffer_pool_dump_pct,支持僅dump每一個緩衝池中最熱的 m% 頁,即爲最熱的數據page。若是在業務高峯時發生宕機,數據庫在恢復重啓時,能夠快速把熱數據導入內存,避免血崩。load操做改進,減小了對用戶活動的破壞性,減小IO資源佔用。
默認以下兩個參數都是開啓的狀態
innodb_buffer_pool_dump_at_shutdown=on innodb_buffer_pool_load_at_startup=on
在系統負載太高的時候,會根據innodb_io_capacity這個參數來設置 dump的速度,io壓力不大的時候能夠適當調大一些。
page cleaner數量的增長
支持多個page cleaner線程從buffer pool中刷新髒頁,能夠適當調整innodb_page_cleaners配置線程數,其默認值爲1。
截斷undo特性
原來undo log在ibdata1中,多餘的undo log容易使共享表空間文件暴漲,佔用過多的磁盤空間。mysql5.6以後能夠把undo log從ibdata1中分離出來,成爲獨立的表空間。5.7版本
經過新增的配置選項innodb_undo_log_truncate啓用,並由參數innodb_max_undo_log_size指定截斷閾值,當undo log超過閾值時截斷已回收的undo log,防止磁盤空間緊張。
官文可見:http://dev.mysql.com/doc/refman/5.7/en/truncate-undo-tablespace.html
二. 複製(replication)功能的提高
並行複製
多源複製
加強半同步
組複製--MGR
並行複製:基於logical-clock(5.7引入)一個組提交內事務均可以並行,能夠達到接近主庫併發效果。
進入prepare狀態的事務均可以在slave並行應用。
多源複製:支持由多個master向一個slave複製。用於將多個服務器備份到單個服務器上。可用於異地容災,集中備份。
加強半同步:是在mysql5.5半同步複製基礎上的加強,在集羣架構切換時能夠保證數據的一致性。由after_commit變成了after_sync,也提升了複製的效率。
組複製:有點像Oracle裏面的RAC集羣,能夠保證多節點並行寫入數據。比較相似於PXC架構。我的建議:目前不是很成熟,先不建議使用。
三. SYS schema功能的加強
sys schema是MySQL 5.7.7中引入的一個系統庫,包含了一些視圖和函數。不一樣於以前的版本,須要經過DBA的經驗之談去排查數據庫的問題,咱們能夠經過sys schema瞭解到,哪些語句使用了臨時表,哪一個用戶請求了最多的io,哪一個線程佔用了最多的內存,哪些索引是無用索引。
查看數據庫中的冗餘索引的SQL語句:
select * from sys.schema_redundant_indexes;
查看數據庫中的索引使用狀況語句:
select index_name,rows_selected,rows_inserted,rows_deleted,rows_updated from schema_index_statistics where table_schema='DB_name' and table_name='table**' and index_name='**' ;
查看數據庫的未使用到的索引:
select * from sys.schema_unused_indexes;
查看數據庫IO寫數據文件的最多10條(TOP 10):
select * from sys.x$io_global_by_file_by_bytes order by total_written desc limit 10;
查看實例消耗的內存:
select * from sys.memory_global_total;
四.優化器的提高:
mysql5.7以前,mysql的優化器很垃圾,是性能瓶頸點。5.7以後改善了不少功能。
UNION ALL查詢的優化。儘可能避免UNION ALL語句建立臨時表,並提升了響應速度。
新增了更多的HINTS,並提供新的HINTS語法。
EXPLAIN FOR CONNECTION 。能獲取一個指定會話中正在執行的SQL語句的執行計劃,而不須要找到SQL語句。
排序效率上面的提高。
IN子查詢的提高。
JSON格式的輸出結果中,還能看到執行計劃的代價信息。
五.設置查詢sql的超時(max_execution_time)
MySQL 5.7.4剛引入名字是max_statement_time,後來改爲max_execution_time。這個參數很實用,是一種自我保護的措施。防止由於一條sql語句的長時間執行,致使數據庫血崩。
六.安全性的加強
mysql_install_db棄用了,改用mysqld加–initialize或–initialize-insecure。
再也不使用password字段,使用authentication_string替代。
MySQL 5.7開始,root用戶的密碼再也不是空的了,而是隨機產生一個,保存於error log,初次登陸需使用密碼並修改密碼。
mysql.user表新增plugin列,且若某帳戶該字段值爲空則帳戶不能使用。
七.sql_mode參數
由以前的NO_ENGINE_SUBSTITUTION變成爲嚴格模式STRICT_TRANS_TABLES SQL mode。
如出現sql書寫有問題的,直接拋出錯誤。不會再出現截斷等現象。也不能在grant的過程當中,直接建立用戶了。
以上就是老張爲你們梳理的mysql5.7的一些新的特性。
生活中戀愛仍是要談,愛情仍是要相信,工做中技術仍是得不斷學習,提升本身,給本身上發條,才能進步得更快。新鮮感這個東西不要一味地要求別人帶給你,咱們也要學會創做出屬於咱們本身的浪漫與新鮮的feel!
superZS(老張)祝你們愛情、事業雙豐收!