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

找到一份合適的工作,就像在工作的八小時之內有了一個心儀的戀人。

老張我呢,原來在上學那會兒,不是特別愛學習,本人長得呢也特別帥(現在做了技術可惜了哈哈!)所以特招漂亮女孩的喜歡,當然自己也特別喜歡和她們談戀愛啦,那感覺老甜蜜了呢。也算得上是情感專家。但是最後都沒啥好結果,弄得我今後都不再相信愛情了。

於是我開始反思自己,到底是哪裏出了問題,剛開始談戀愛的時候,兩人都感覺特別好,可是隨着時間地流逝,感情就特別容易出現裂痕。原來是有一種叫做新鮮感的東西,在作祟。新鮮感只是說在你們還不是很瞭解對方的情況下才有的,時間一長,兩人之間都彼此太熟悉了,就缺失了愛情中需要的火花元素,化學反應一旦不在,自然任何一次戀愛的開始也就意味着是分手的倒計時。

那如何保持這種新鮮感呢,時間久了,情侶之間就只能說是保鮮,需要偶爾給對方一點小小的驚喜和浪漫。

生活中談戀愛是這樣,那研究技術也同樣如此。一沉不變的技術知識,時間長了,我們都會覺得枯燥無味,索然無趣。需要新鮮的血液進入到我們的神經中樞,激發我們對於求知慾的渴望。


今兒跟大家梳理一下MySQL數據庫中 5.7這個版本的新特性,讓那些平時只顧着工作,沒時間去研究新知識的同學,可以看到數據庫的新功能,新特性,今後有利用應用到生產中,更便於我們開展工作。讓我們把這個戀愛談得更長久,更甜蜜。


目前互聯網公司,線上mysql用的最多的版本是mysql5.5,5.6,5.7。先看下三個版本的性能對比圖:

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(老張)祝大家愛情、事業雙豐收!






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章