與技術談一場永不分手的戀愛

找到一份合適的工做,就像在工做的八小時以內有了一個心儀的戀人。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倍
併發

wKiom1lxkk2zFtEbAACjlUZXOWU868.png-wh_50

OLTP READ WRITE

MySQL5.7比MySQL5.6快近似於1.5倍

比MySQL5.5快近似於2.5倍

wKioL1lxliGClC8xAACxFHJtAoQ386.png-wh_50

MySQL數據庫,在5這個版本上待了10年之久,server層沒有太大的變化,主要是存儲引擎層的改變。也就是目前最火的Innodb存儲引擎,不管從它的功能上、仍是性能上,都有所提升。

一.    先從Innodb角度介紹

Innodb的加強分爲三大部分:

1.功能提高

  1.  Online Alter table;

  2.  Innodb_buffer_pool online change;

  3. 原子寫特性的檢測;能夠關閉double_write

  4. Innodb buffer pool dump

2.性能提高

  1. Innodb臨時表的DDL性能提高;臨時表不須要再記錄redo log;

  2. Read Only性能上面的提高;

  3. page cleaner線程數量上的增長,提高innodb_page_cleaners的效率

3.其餘點提高

  1. 截斷undo特性;

  2. 支持分區表的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)功能的提高

  1. 並行複製

  2. 多源複製

  3. 加強半同步

  4. 組複製--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以後改善了不少功能。

  1. UNION ALL查詢的優化。儘可能避免UNION ALL語句建立臨時表,並提升了響應速度。

  2. 新增了更多的HINTS,並提供新的HINTS語法

  3. EXPLAIN FOR CONNECTION 。能獲取一個指定會話中正在執行的SQL語句的執行計劃,而不須要找到SQL語句。

  4. 排序效率上面的提高。

  5. IN子查詢的提高。

  6. JSON格式的輸出結果中,還能看到執行計劃的代價信息。


五.設置查詢sql的超時(max_execution_time)

MySQL 5.7.4剛引入名字是max_statement_time,後來改爲max_execution_time。這個參數很實用,是一種自我保護的措施。防止由於一條sql語句的長時間執行,致使數據庫血崩。


六.安全性的加強

  1. mysql_install_db棄用了,改用mysqld加–initialize或–initialize-insecure。

  2. 再也不使用password字段,使用authentication_string替代

  3. MySQL 5.7開始,root用戶的密碼再也不是空的了,而是隨機產生一個,保存於error log,初次登陸需使用密碼並修改密碼。

  4. mysql.user表新增plugin列,且若某帳戶該字段值爲空則帳戶不能使用。

七.sql_mode參數

由以前的NO_ENGINE_SUBSTITUTION變成爲嚴格模式STRICT_TRANS_TABLES SQL mode

如出現sql書寫有問題的,直接拋出錯誤。不會再出現截斷等現象。也不能在grant的過程當中,直接建立用戶了。


以上就是老張爲你們梳理的mysql5.7的一些新的特性。

生活中戀愛仍是要談,愛情仍是要相信,工做中技術仍是得不斷學習,提升本身,給本身上發條,才能進步得更快。新鮮感這個東西不要一味地要求別人帶給你,咱們也要學會創做出屬於咱們本身的浪漫與新鮮的feel!


superZS(老張)祝你們愛情、事業雙豐收!

相關文章
相關標籤/搜索