Mysql 5.6 在性能、可伸縮性、可用性方面的新突破

<接上篇>
更好的應用程序可用性:在線 DDL/模式 變化
    如今基於web的應用程序被設計用來快速的進化以及自適應業務和生產需求。當一個應用程序必須迅速適應新的產品線或新產品時,後端數據庫模式也必須跟着適應,但是又要求同時應用程序可以正常的業務操作。mysql5.6提供了這種程度的在線模式,此新語法爲ALTER TABLE DDL,其他附加有:
CREATE INDEX
DROP INDEX
Change AUTO_INCREMENT value for a column
ADD/DROP FOREIGN KEY
Rename COLUMN
Change ROW FORMAT, KEY_BLOCK_SIZE for a table
Change COLUMN NULL, NOT_NULL
Add, drop, reorder COLUMN 

DBA和開發者們可以在標準的innoDB表上增加索引或者其他的修改操作,同時數據庫依然可以供應用程序使用。這對於快速迭代的應用非常有益,特別是開發人員需要模式的靈活性,以適應不斷變化的業務需求。

更好的開發靈活性:爲innoDB增加Nosql
    Mysql5.6爲innoDB提供了memcached API。爲mysqld增加一個新的memcached守護進程插件,這樣memcached協議被直接映射到本機的innoDB API,允許開發者使用現存的memcached客戶端來直接忽略掉查詢語法的解析消耗,直接對數據進行查找和修改。這些API可以對現有的memcached庫和客戶端進行重用,整合一個持久、事故安全、事務數據庫後端 來對memcached功能進行了擴展。實現如下:
測試結果顯示,在整體吞吐量上,SET/INSERT操作性能要提升9倍左右:
不僅開發者和DBA們獲得了更好的性能和靈活性,同樣也減少了複雜性,壓縮之前單獨的緩存和數據庫層到一個單一的數據管理層次,這樣消除緩存一致性維護的開銷。

更好的開發靈活性:InnoDB擴展使用案例
    mysql5.6新的特徵和優化器將innoDB擴展到更多的使用案例中去,這樣開發者可以標準化一個單一的存儲引擎 已達到簡化應用程序的目的。
    新的全文索引(FTS) - 爲了取代Myisam的FTS,現在InnoDB允許開發者在表上建立FULLTEXT索引來標示文本內容,同時也加快了應用搜索單詞和短語。InnoDB的全文搜索支持自然語言/邏輯模式、鄰近搜索 和 相關性排序。一個簡單的使用例子如下:
CREATE TABLE quotes 
(id int unsigned auto_increment primary key ,
 author varchar(64) ,
 quote varchar(4000) ,
 source varchar(64) ,
 fulltext(quote) 
) engine=innodb; 

SELECT author AS “Apple" FROM quotes 
WHERE match(quote) against (‘apple' in natural language mode); 
    新的可運輸式表空間 - innoDB爲每個表產生一個.idb文件,現在,這個文件可以在物理存儲設備和數據庫服務器間自由傳輸;當創建一個新表,開發者可以在mysql數據空間外指定一個其他的路徑來存儲.idb文件。這可以將比較“hot”或者比較忙的表數據轉移到外部的網絡存儲設備(SSD,HDD),這樣不會對應用或者數據庫的花銷造成競爭。這個新功能還支持快速無縫的應用,允許用戶方便地導出/導入InnoDB表 轉移到其他正在運行的MySQL服務器。
    例子導出:
CREATE TABLE t(c1 INT) engine=InnoDB; 
FLUSH TABLE t FOR EXPORT; -- quiesce the table and create the meta data file 
$innodb_data_home_dir/test/t.cfg
UNLOCK TABLES; 
    相應的導入:
CREATE TABLE t(c1 INT) engine=InnoDB; -- if it doesn't already exist 
ALTER TABLE t DISCARD TABLESPACE; 
-- The user must stop all updates on the tables, prior to the IMPORT 
ALTER TABLE t IMPORT TABLESPACE;    

改進的複製和高可用性
    複製是最常用的mysql功能,經常表現在在擴展性和高可用性上(HA)。mysql5.6包含了新的功能,允許開發者爲下一代網絡、雲計算、社交和移動應用程序和服務等建立自愈式的複製拓撲和高性能的主從集羣。關鍵點包括:
    新的全局事務標識符(GTIDs) (介紹的不太懂,可自行google相關GTID的資料)- GTIDs來強化數據庫的主備一致性,故障恢復,以及容錯能力。允許跟蹤複製事務完整性,實現的相關技術爲複製主/從拓撲、提供一個可自愈的恢復點、以及允許DBA和開發者們更加容易的標示master失敗後最新的那個slave。通過直接構建到二進制日誌流中,GTID不在需要其他的第三方插件來提供這種級別的跟蹤報告。
    新的mysql複製工具 - 一套新的python工具可以用來使用GTID來提供複製管理和監控的功能,它可以將失敗的master關閉或者進行替換維護。這樣,如果在沒有操作員干預的情況下發生了計劃內和計劃外的停機事故,遍不在需要額外的第三方高可用性解決方案、保護性網絡和雲服務等。
    新的多線程slave - 基於模式的工作線程間的分割處理,允許可以並行的進行更新操作,不在是原先的順序執行。這樣爲那些在數據庫上對應用隔離的數據進行更新帶來的好處。如,多租戶系統:
測試顯示,在一定的環境下,同時開啓10個工作線程,性能提升5倍以上。
    新的二進制日誌組提交(BGC) - 在mysql5.6中,對master羣的複製以組的形式寫進二進制文件中,而不再是一次性提交,顯著的提高了master拓撲的性能。BGC同樣支持了更好的細粒度鎖,這樣減少鎖等待,再次增加了性能增益。效果如下:
在主服務器的吞吐量方面,mysql5.6的性能比5.5提升了180%。BGC很大程度的消除了那些用戶不得不在master性能開銷、擴展性、MySQL複製所提供高性能收益 之間進行的選擇。
    新的基於行復制的優化 - mysql5.6提供了一個新的選項binlog-row-image=minimal,這個選項允許應用程序只能對行的鏡像數據進行復制,而不在關心行是否已經進行了DML操作。這提高了主從機器的複製吞吐量,減少了二進制日誌所佔用的磁盤空間、網絡資源和內存佔用。
    新的事故安全slave - mysql5.6保存了基於表的二進制日誌文件,這樣從機器就可以自動回滾到上一次成功複製的版本,並且不再需要管理員介入。她不僅降低了運營開銷,同樣也降低了從數據庫試圖恢復損壞文件時所帶來的磁盤數據丟失的風險。更進一步說,如果主服務器突然出現事故而造成了二進制文件的丟失,那麼服務器可以自動恢復到當前可以正確讀取的位置。
    新的複製效驗和 - mysql5.6可以確保了正在複製到從服務器上的數據的完整性,方法是檢測數據是否損壞,並且在從服務器數據損壞之前返回一個錯誤信息,從而防止從服務器本身被損壞。
    新的延時複製 - mysql5.6提供了一個保護措施,允許開發者在複製流中添加定義延遲,從而防止主服務器上產生的錯誤被傳播到從服務器中。通過配置主到從之間的時間延遲,如果發生了故障或者事故,從服務器可以被提升爲新的主服務器,方便了將數據庫恢復到以前的狀態。它同樣可以 在錯誤和故障發生之前 檢查一個數據庫的狀態,而不再需要重新加載一個備份。

改進性能模式
    在mysql5.5中就對mysql的性能模式做了介紹,他被設計用來味關鍵性能指標提供一個度量時間點。mysql5.6改善了性能模式,新的測試點包括:
    Statements/Stages - 我的哪些查詢是最耗資源的?他們把時間花在哪兒?
    Table/Index I/O, Table Locks - 哪些應用的表或索引佔用了大多數的負載?
    Users/Hosts/Accounts - 哪個應用程序的用戶、主機和賬號最佔資源?
    Network I/O - 網絡負載如何?session空閒了多久?

    mysql5.6現在在my.cnf文件中默認開啓性能模式,同時默認開啓的還有優化及自動修正設置,這樣減少了開銷,所以使用性能模式生產服務器來監控最常見應用程序的用例並不是太大的問題。另外,新的原子級別的測試能夠捕獲更加細粒度級別的資源消耗,比如用戶、主機、賬戶、應用程序等等,特別 雲計算環境中 用於支付和退款。
    mysql5.6在性能模式中有許多獨創專利,其中的許多都已經發表在blog中,你可以參考其中技術和實用的細節。你可以從這裏來閱讀博客內容Mark Leith Marc Alff

其他一些性能的增強
    新的自動配置優化 - mysql5.6改變了原來的服務器默認配置,在當前的系統架構下支持更好的開箱即用性能。當更改大部分一般的配置時,這些新的默認配置將會減少前期準備所花費的時間。現在許多配置選項可以根據環境自動設置大小值,當服務器啓動時也可人爲的設置或更改。
    改進的TIME/TIMESTAMP/DATETIME數據類型:
  • TIME/TIMESTAMP/DATETIME - 現在支持了微妙級別的精度。
  • TIMESTAMP/DATETIME - 在5.5就已經支持了,允許開發者指定當前時間戳或者自動更新值或者兩者同時作爲TIMESTAMP和DATETIME的默認值。
  • TIMESTAMP -  現在默認值爲空。當不再被指定值的時候,TIMESTAMP 列不再如原來一樣自動獲取DEFAULT NOW()或 ON UPDATE NOW() 的值,而是用空來替代。
    更好的條件處理 GET DIAGNOSTICS
    mysql5.6允許開發者更加容易去對錯誤和代碼異常進行檢查,通過使用新引入的mysql診斷區域和GET DIAGNOSTICS命令接口。診斷區域可以使用多個選項,提供以下兩種信息:
  • 陳述- 它提供了受影響的行數和執行命令的數量;
  • 條件 - 返回所有執行條件的前一個操作所產生的錯誤代碼和錯誤信息。
    新的GET DIAGNOSTICS命令爲診斷區域提供了一個標準接口,通過CLI或者應用程序代碼,可以輕鬆的檢索和處理最近語句的執行結果:
mysql> DROP TABLE test.no_such_table; 
ERROR 1051 (42S02): Unknown table 'test.no_such_table' 
mysql> GET DIAGNOSTICS CONDITION 1 
-> @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT; 
mysql> SELECT @p1, @p2; 
+-------+------------------------------------+
| @p1 | @p2 | 
+-------+------------------------------------+
| 42S02 | Unknown table 'test.no_such_table' | 
+-------+------------------------------------+

Options for leveraging the MySQL Diagnostics Area are detailed here. You can learn more about GET DIAGNOSTICS here.   

    改進的ipv6支持
  • mysql5.6改進了INET_ATON() 來轉換和存儲基於字符串的IPv6地址,將其作爲二進制數據進行存儲,已達到最小空間消耗。
  • mysql5.6改變了綁定地址選項的默認值,從 “0.0.0.0”到“0::0”,這樣MySQL服務器接受連接所有IPv4和IPv6地址。You can learn more here
    改進的分區
  • 提高分區的數量來提高表的性能 - mysql5.6現在在高度分區系統中進行執行和擴展,特別是insert操作,涉及到數百個分區。
  • 導入/導出 表 從/到 分區表 - mysql5.6允許用戶交換表分區或者子分區,命令爲ALTER TABLE ... EXCHANGE PARTITION,已經存在於原來的分區或者子分區中的行將會被轉移去一個非分區表,相應的,任何存在於非分區表中的行也可以被轉移到分區表或子分區表中。
  • 明確分區選擇 - mysql5.6支持顯式選擇分區和子分區,當給定一個where條件時,將會對行進行上述檢查。和自動分區類似,被檢查的分區也是可被 指定/控制 的,都支持查詢和大量的DML語句(SELECT, DELETE, INSERT, REPLACE, UPDATE, LOAD DATA, LOAD XML)。
    改進GIS:精確的空間操作 - mysql5.6通過精確的對象形狀來幾何操作提供支持,按照OpenGis的標準來對兩個幾何值之間的關係進行相應測試。

總結
    mysql5.5已經被稱爲是有史以來最好的mysql版本。mysql5.6在這基礎上進行了改進,提高了性能、可伸縮性、可用性、事務吞吐量等,爲了滿足當下最苛刻的web、雲以及嵌入式等各方面的需求。

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