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

    前言:拋個磚,引堆玉。對mysql5.6新特性進行了簡單的翻譯,主要目的是強迫自己耐性子看完5.6的說明,翻譯中估計很多地方都是自己能看懂大家顯迷茫,如覺得理解不了,請自行對照原文理解,歡迎更正。每更正完一點請再次與大家分享。

    隨着mysql5.6 即將在未來幾天內公佈其生產GA版,很有必要來總結下它的一些關鍵特性,從而能解釋下爲什麼mysql5.6版本被稱爲是最好的發佈版。簡單來說,mysql5.6在數據庫內核方面爲幾乎每個功能點都做了提升,包括了:
  • 爲 零顧慮的應用程序部署 提高了安全性;
  • 更好的性能和可伸縮性
    • 改進了InnoDB引擎使其增加了事務吞吐量;
    • 改進了優化器能更好的檢查query的執行時間和效率;
  • 在DDL/Schema方面提供了更好的可用性;
  • 爲InnoDB提供了Memcache Api的Nosql支持;
  • 改進了 高性能、分佈式部署下的 響應情況;
  • 提供了更好的性能可視化分析;
  • 其他一些重要的增強;
爲 零顧慮的應用程序部署 提高了安全性
    安全是每個DBA和系統管理員首要關心的問題。出於這種考慮,Mysql5.6介紹了一種全新的方法來對密碼進行內部的處理和加密。這個新的選項和特點包括:
  • 在master.info中新的替代密碼 - mysql5.6擴展了命令START SLAVE,允許DBA們指定超級用戶和密碼作爲slave選項的一部分。爲了驗證這個指定的超級用戶和密碼,之前的版本往往需要一個外部身份驗證插件(用戶指定或者 mysql企業版提供)連接到主服務器 來做這項操作。有了現在的這個選項就不需要將這些信息暴露在master.info這樣沒有加密過的純文本中了。
  • 在一般查詢日誌、慢速查詢日誌 和 二進制日誌中,對密碼採用了新的加密方式 - 當密碼在語句中寫入上述這些日誌時不再是純文本的方式。
  • 對密碼進行新的hash散列 - 在原來的mysql內部中是通過PASSWORD()對密碼進行加密散列,現在則是通過SHA-256散列算法用一個隨機值對密碼進行散列加密。
  • 在命令行對密碼提供了新的選項 - Mysql5.6 提供了一個‘scrambled’選項/配置文件(.mylogin.cnf)用來安全的存儲用戶密碼,而不用像之前一樣直接在命令行中輸入明文密碼。
  • 在下次登錄時更新密碼 - DBA和開發者可以在mysql.user表中操作一個flag標示,用來控制賬戶密碼何時更換爲新密碼。
  • 基於密碼生效的新策略 - 現在可以根據 適當的強度、長度、混合度、是否有特殊字符以及一些其他用戶定義的策略來將密碼定義爲LOW, MEDIUM 以及STRONG。

更好的性能和可伸縮性:改進的InnoDB引擎
    從操作系統的立場來看,MYSQL5.6提供了更好的持續的線性性能、在多處理器系統上更大規模的運行 以及 更高的cpu併發。這些的關鍵點是提升了InnoDB存儲引擎的效率和併發性,移除了原先在InnoDB核心中的遺留線程徵用和互斥鎖。這些提升使得mysql可以在x86基礎上,充分的開發更加先進的多線程處理能力。
    內部測試數據顯示,相對於現在的版本mysql5.5,Read/write和readonly方面都有了明顯的進步。下圖展示了mysql5.6在48個併發線程的情況下,read/write的TPS數據情況:
    以及readonly的TPS數據情況:
更好的事務吞吐量:
    mysql5.6在高併發、事務和讀密集型工作負載方面 爲 innoDB提升了更好的性能和可擴展性。在這些情況中,最好的衡量標準是 一個應用程序的執行和擴展爲併發用戶工作負載增長的性能。爲了支持這些例子,innoDB提供了一個新的重構體系結構,爲底層數據提供了最小化互斥鎖、瓶頸、更加一致的訪問路徑等等。這方面的改進包括了:
  • 內核互斥分裂,移除了單一節點的競爭
  • 新線程刷新操作
  • 新的多線程清理
  • 新的自適應hash算法
  • 更少的緩衝池競爭
  • 更好更一致的查詢執行
這些改進的最終結果測試基準展示如下:
    在linux下,mysql5.6比mysql5.5提升了150%的TPS吞吐量。在windows2008環境下做類似的測試同樣有47%的性能提升。

更好的read only 工作負載吞吐量:
    已經爲innoDB的read only處理性能做了提升,這樣極大的提升了高併發下基於web的查詢和生成報告應用程序的性能。這些優化繞開了事務處理的花銷,當autocommit=1時,這些優化項也是默認啓動的,或者可以由開發者手動開啓,相關命令爲:START_TRANSACTION_READ_ONLY。例子如:
SET autocommit = 0;
START_TRANSACTION_READ_ONLY;
SELECT c FROM T1 WHERE id=N;
COMMIT; 
優化後的性能對比如下:
    在linux下,mysql5.6比mysql5.5提升了230%的TPS吞吐量。在windows2008環境下做類似的測試同樣有65%的性能提升。

再此上下文中所有的性能分析對比測試都是在如下的環境中進行:
  • Oracle Linux 6
  • Intel(R) Xeon(R) E7540 x86_64
  • MySQL leveraging:
    • 48 of 96 available CPU threads
    • 2 GHz, 512GB RAM 
在使用固態硬盤(SSD)的情況下有更好的性能:
    普通的旋轉磁盤對任何系統來說都可能是最普遍的瓶頸所在,只因爲他們的機械零件物理性的限制了併發性能的增長。因此,許多MYSQL應用正在逐步部署在SSD中,使其擁有了內存般的速度和穩定性,並且今天的網絡系統支持最高水平的併發性能。處於這種考慮,mysql5.6爲使用SSD而專門增加了一些關鍵的性能增強設計,包括了:
  • 對4k、8k大小的page提供支持,從而能更好的使用SSD的標準存儲算法。
  • 可移植的.ibd文件(innoDB數據),這樣使“hot”的innoDB表更加容易從默認數據目錄轉移到SSD或者網絡存儲設備。
  • 爲innoDB的undo log日誌提供了單獨的表空間,這樣使undo log可以從當前系統表空間中轉移到其他一個或多個表空間。爲undo log設計的這種讀密集型的io模式 允許這些新的表空間更容易轉移到SSD中,同時也可以保證系統表空間同時存儲於硬盤中。
更好的查詢時間和檢測:改進優化控制器
    mysql5.6的優化器已經做了重構以達到更好的性能和效率,爲更好的查詢執行時間和診斷提供了一種改進的功能設置,5.6版本關鍵性的改進點包括了:
    子查詢最優化 - 使用半鏈接和實體化,mysql優化器大大提高了子查詢的性能,從而簡化了開發者對query的構建工作。特別的,優化器現在能更加高效的處理子查詢中的from語句;from語句中的實體化只有在執行的過程中需要時纔會進行,極大的提高了性能。此外,優化器可以在執行期間爲派生表增加索引,從而來加快行檢索。以下是一個測試的例子,和之前的版本比起來,提升了不止一個數量級(從天到秒!!):
select c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, sum(l_quantity)
from customer, orders, lineitem
where o_orderkey in (
select l_orderkey
from lineitem
group by l_orderkey
having sum(l_quantity) > 313
)
and c_custkey = o_custkey
and o_orderkey = l_orderkey
group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
order by o_totalprice desc, o_orderdate
LIMIT 100;

    文件排序優化 - 如果查詢中有order by 和 小值的limit,優化器將會使用單一表掃描來產生一個有序的結果集。如下面的語句:
    SELECT col1, ... FROM t1 ... ORDER BY name LIMIT 10;   
    內部標準測試顯示,查詢時間提升至少四倍,這樣有助於提高整體用戶體驗和相應時間。

    Index Condition Pushdown (ICP) - 默認情況下,優化器現在將where語句推到引擎層處做分析過濾,將表掃描後產生的結果集數據返回給mysql server。
CREATE TABLE person (
personid INTEGER PRIMARY KEY,
firstname CHAR(20),
lastname CHAR(20),
postalcode INTEGER,
age INTEGER,
address CHAR(50),
KEY k1 (postalcode,age)‏
) ENGINE=InnoDB;

SELECT lastname, firstname FROM person
    WHERE postalcode BETWEEN 5000 AND 5500 AND age BETWEEN 21 AND 22; 
內部標準測試顯示,使用ICP,針對上面這個表的查詢執行時間提升至少15倍。

    批量鍵存取(BKA) & 多量程讀(MRR) - 優化器現在允許存儲引擎批量使用主鍵,並且允許存儲引擎訪問、排序、返回數據變得更有效率,大大的提高了查詢執行效率。
BKA和MRR一起使用時查詢效率提升了280倍。

    更好的優化診斷 - mysql5.6的優化器提供了更好的診斷和調試,具體有:
  • EXPLAIN對INSERT, UPDATE, and DELETE提供了支持;
  • EXPLAIN打算使用json作爲輸出,從而達到更精準的優化指標和更好的可讀性;
  • 提供優化的痕跡, 便於跟蹤優化決策過程。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章