Baron Schwartz,Peter Zaitsev,Vadim Tkachenko 著,寧海元,周振興,彭立勛 等 譯
“只要你不敢以MySQL專家自詡,又豈敢錯(cuò)過這本神書?”
“一言以蔽之,寫得好,編排得好,需要參考時(shí)容易到爆!”
“我可是從頭到尾看了一遍上一版,可還是毫不猶豫拿起了這本《高性能MySQL(第3版)》,而且看完后一點(diǎn)都不后悔……”
◎ 學(xué)習(xí)MySQL新特性,包括存儲(chǔ)引擎、分區(qū)數(shù)據(jù)庫(kù)、觸發(fā)器和視圖
◎ 實(shí)現(xiàn)復(fù)制的改進(jìn)、高可用和集群
◎ 獲得在云端運(yùn)行MySQL的高性能
◎ 優(yōu)化高級(jí)查詢特性,如全文索引
◎ 從現(xiàn)代的多核CPU和固態(tài)硬盤中獲益
◎ 探索備份和恢復(fù)的策略,包括新的在線備份工具
《高性能MySQL(第3版)》是MySQL 領(lǐng)域的經(jīng)典之作,擁有廣泛的影響力。第3 版更新了大量的內(nèi)容,不但涵蓋了MySQL5.5版本的新特性,也講述了關(guān)于固態(tài)盤、高可擴(kuò)展性設(shè)計(jì)和云計(jì)算環(huán)境下的數(shù)據(jù)庫(kù)相關(guān)的新內(nèi)容,原有的基準(zhǔn)測(cè)試和性能優(yōu)化部分也做了大量的擴(kuò)展和補(bǔ)充。全書共分為16章和6 個(gè)附錄,內(nèi)容涵蓋MySQL架構(gòu)和歷史,基準(zhǔn)測(cè)試和性能剖析,數(shù)據(jù)庫(kù)軟硬件性能優(yōu)化,復(fù)制、備份和恢復(fù),高可用與高可擴(kuò)展性,以及云端的MySQL和MySQL相關(guān)工具等方面的內(nèi)容。每一章都是相對(duì)獨(dú)立的主題,讀者可以有選擇性地單獨(dú)閱讀。
《高性能MySQL(第3版)》不但適合數(shù)據(jù)庫(kù)管理員(DBA)閱讀,也適合開發(fā)人員參考學(xué)習(xí)。不管是數(shù)據(jù)庫(kù)新手還是專家,相信都能從本書有所收獲。
BaronSchwartz是一位軟件工程師,居住在弗吉尼亞州的Charlottesville,網(wǎng)絡(luò)常用名是Xaprb,這是按照QWERTY鍵盤的順序在Dvorak鍵盤上打出來的名字。在不忙于解決有趣的編程挑戰(zhàn)時(shí),Baron會(huì)和他的妻子Lynn以及小狗Carbon一起享受閑暇的時(shí)光。他有一個(gè)軟件工程方面的博客。
PeterZaitsev曾經(jīng)是MySQLAB公司高性能組的經(jīng)理,目前在運(yùn)作mysqlperformanceblog.com網(wǎng)站。他擅長(zhǎng)于幫助那些每天有數(shù)以百萬計(jì)訪問量的網(wǎng)站的管理員解決問題,這些網(wǎng)站通常需要幾百臺(tái)機(jī)器來處理TB級(jí)的數(shù)據(jù)。他常常為了解決一個(gè)問題而不停地升級(jí)硬件和軟件(比如查詢優(yōu)化)。Peter還經(jīng)常在各種會(huì)議上演講。
VadimTkachenko曾經(jīng)是MySQLAB公司的性能工程師。作為一名在多線程編程和同步方面的專家,他的主要工作是基準(zhǔn)測(cè)試、性能剖析,以及找出系統(tǒng)的性能瓶頸。他還在性能監(jiān)控和調(diào)優(yōu)方面做了一些工作,使得MySQL在多核機(jī)器上有更好的可擴(kuò)展性。
譯者簡(jiǎn)介
寧海元有超過十年的數(shù)據(jù)庫(kù)管理經(jīng)驗(yàn),從最初的SQLServer2000到Oracle再到MySQL,擅長(zhǎng)數(shù)據(jù)庫(kù)高可用架構(gòu)、性能優(yōu)化和故障診斷。2007年加入*,帶領(lǐng)*DBA團(tuán)隊(duì)完成了數(shù)據(jù)庫(kù)的垂直拆分、水平拆分,遷移到MySQL體系等主要工作,為*業(yè)務(wù)的快速增長(zhǎng)提供支撐。目前專注于無線數(shù)據(jù)領(lǐng)域。網(wǎng)絡(luò)常用名NinGoo,
周振興畢業(yè)于北京師范大學(xué)數(shù)學(xué)系,2009年加入*數(shù)據(jù)庫(kù)團(tuán)隊(duì),負(fù)責(zé)MySQL運(yùn)維管理工作,有豐富的MySQL性能優(yōu)化、Troubleshooting經(jīng)驗(yàn),對(duì)MySQL主要模塊的實(shí)現(xiàn)和原理有深入的研究,經(jīng)歷了*MySQL實(shí)例從30到3000的發(fā)展,對(duì)系統(tǒng)架構(gòu)、高可用環(huán)境規(guī)劃都有深入理解。
彭立勛2010年大學(xué)畢業(yè)后加入********運(yùn)維部。作為一名MySQLDBA,在運(yùn)維MySQL的過程中對(duì)MySQL和InnoDB的一些功能和缺陷進(jìn)行了補(bǔ)充,編寫了多主復(fù)制和數(shù)據(jù)閃回等補(bǔ)丁。目前在阿里集團(tuán)核心系統(tǒng)研發(fā)部數(shù)據(jù)庫(kù)組,專注于MySQL數(shù)據(jù)庫(kù)相關(guān)的開發(fā)工作。后來一些補(bǔ)丁被MySQL之父Mony看中,多主復(fù)制、線程內(nèi)存監(jiān)控等補(bǔ)丁被合并到了MariaDB10.0版本,本人也因此成為MariaDB提交組(Maria-captains)成員。
翟衛(wèi)祥畢業(yè)于武漢大學(xué),研究生階段從事數(shù)據(jù)庫(kù)相關(guān)研究。畢業(yè)后就職數(shù)據(jù)庫(kù)技術(shù)團(tuán)隊(duì)至今,主要負(fù)責(zé)阿里內(nèi)部MySQL代碼分支維護(hù),包括MySQLBugFix及新特性開發(fā)。對(duì)MySQL內(nèi)核有一定的研究。
劉輝2008年畢業(yè)于西安電子科技大學(xué)計(jì)算機(jī)系,碩士學(xué)位。2011年加入數(shù)據(jù)庫(kù)技術(shù)團(tuán)隊(duì),花名希羽,MySQL內(nèi)核開發(fā)工程師。
每一章均別具匠心,力求理論與實(shí)踐的精確平衡,且布滿無價(jià)之寶,有時(shí)甚至越過MySQL舞臺(tái),完全適用于任一數(shù)據(jù)庫(kù)。其中第二章“MySQL基準(zhǔn)測(cè)試”及第3章“服務(wù)器性能剖析”是非常必要的基礎(chǔ),推薦提前閱讀。
縱觀全書,作者推薦的工具、實(shí)戰(zhàn)案例及經(jīng)驗(yàn)過的診斷技術(shù),可大大提高你的性能急救技能,以及加深對(duì)MySQL本質(zhì)的理解。然而,本書值得推崇的,還是其在探討性能的同時(shí),將數(shù)據(jù)庫(kù)結(jié)構(gòu)的客觀方面納入思考,這是其他書里難以看到的。此外,增補(bǔ)的MySQL高可用性及云特性,也讓人更加欣喜。
相信不少人會(huì)因?yàn)檎也坏侥承幸玫馁Y料或工具而苦惱,但從本書中按圖索驥,會(huì)發(fā)現(xiàn)這些東西正是作者對(duì)MySQL社區(qū)的杰出貢獻(xiàn),也就是說,你可以直接用這些工具!
很多年前我就是這本書的“粉絲”了,這是一本偉大的書,第三版尤其如此。這些世界*的專家不僅僅分享他們的專業(yè)知識(shí),也花了很多時(shí)間來更新和添加新的章節(jié),且都是高品質(zhì)的內(nèi)容。本書有大量關(guān)于如何獲得MySQL高性能的細(xì)節(jié)信息,并且關(guān)注的是提升性能的過程,而不僅僅是描述事實(shí)結(jié)果和瑣碎的細(xì)枝末節(jié)。這本書將告訴讀者如何將事情做得更好,不管MySQL在不同版本中的行為有多么大的改變。
毫無疑問,本書的作者是有資格來寫這么一本書的人,他們經(jīng)驗(yàn)豐富,有合理的方法,關(guān)注效率,并且精益求精。說到經(jīng)驗(yàn)豐富,本書的作者已經(jīng)在MySQL性能領(lǐng)域工作多年,從MySQL還沒有什么可擴(kuò)展性和可測(cè)量性的時(shí)代,直到現(xiàn)在這些方面已經(jīng)有了長(zhǎng)足的進(jìn)步。而說到合理的方法,他們簡(jiǎn)直把這件事情當(dāng)成了科學(xué),首先定義需要解決的問題,然后通過合理的猜測(cè)和精確的測(cè)量來解決問題。
我對(duì)作者在效率方面的關(guān)注尤其印象深刻。作為顧問,他們時(shí)間寶貴。客戶是按照他們的時(shí)間付費(fèi)的,所以都希望能更快地解決問題。所以本書作者定義了一整套的流程,開發(fā)了很多的工具,讓事情變得正確和高效。在本書中,作者詳細(xì)描述了這些流程,并且發(fā)布了工具的源代碼。
最后,本書作者在工作上一直精益求精。比如從吞吐量到響應(yīng)時(shí)間的關(guān)注,致力于了解MySQL在新硬件上的性能表現(xiàn),追求新的技能如排隊(duì)理論對(duì)性能的影響,等等。我相信本書預(yù)示了MySQL的光明前景。MySQL已經(jīng)支持高要求的工作負(fù)載,本書作者也在努力提升MySQL社區(qū)內(nèi)對(duì)性能的認(rèn)識(shí)。同時(shí),他們還直接為性能提升做出了貢獻(xiàn),包括XtraDB和XtraBackup。一直以來我從他們身上學(xué)到了不少東西,也希望讀者多花點(diǎn)時(shí)間讀讀本書,一定會(huì)同樣有所收益。
——MarkCallaghan,F(xiàn)acebook軟件工程師
推薦序
前言
第1章 MySQL 架構(gòu)與歷史
1.1 MySQL 邏輯架構(gòu)
1.1.1 連接管理與安全性
1.1.2 優(yōu)化與執(zhí)行
1.2 并發(fā)控制
1.2.1 讀寫鎖
1.2.2 鎖粒度
1.3 事務(wù)
1.3.1 隔離級(jí)別
1.3.2 死鎖
1.3.3 事務(wù)日志
1.3.4 MySQL 中的事務(wù)
1.4 多版本并發(fā)控制
1.5 MySQL 的存儲(chǔ)引擎
1.5.1 InnoDB 存儲(chǔ)引擎
1.5.2 MyISAM 存儲(chǔ)引擎
1.5.3 MySQL 內(nèi)建的其他存儲(chǔ)引擎
1.5.4 第三方存儲(chǔ)引擎
1.5.5 選擇合適的引擎
1.5.6 轉(zhuǎn)換表的引擎
1.6 MySQL 時(shí)間線(Timeline)
1.7 MySQL 的開發(fā)模式
1.8 總結(jié)
第2章 MySQL 基準(zhǔn)測(cè)試
2.1 為什么需要基準(zhǔn)測(cè)試
2.2 基準(zhǔn)測(cè)試的策略
2.2.1 測(cè)試何種指標(biāo)
2.3 基準(zhǔn)測(cè)試方法
2.3.1 設(shè)計(jì)和規(guī)劃基準(zhǔn)測(cè)試
2.3.2 基準(zhǔn)測(cè)試應(yīng)該運(yùn)行多長(zhǎng)時(shí)間
2.3.3 獲取系統(tǒng)性能和狀態(tài)
2.3.4 獲得準(zhǔn)確的測(cè)試結(jié)果
2.3.5 運(yùn)行基準(zhǔn)測(cè)試并分析結(jié)果
2.3.6 繪圖的重要性
2.4 基準(zhǔn)測(cè)試工具
2.4.1 集成式測(cè)試工具
2.4.2 單組件式測(cè)試工具
2.5 基準(zhǔn)測(cè)試案例
2.5.1 http_load
2.5.2 MySQL 基準(zhǔn)測(cè)試套件 .
2.5.3 sysbench
2.5.4 數(shù)據(jù)庫(kù)測(cè)試套件中的dbt2 TPC-C 測(cè)試
2.5.5 Percona 的TPCC-MySQL 測(cè)試工具
2.6 總結(jié)
第3章 服務(wù)器性能剖析
3.1 性能優(yōu)化簡(jiǎn)介
3.1.1 通過性能剖析進(jìn)行優(yōu)化
3.1.2 理解性能剖析
3.2 對(duì)應(yīng)用程序進(jìn)行性能剖析
3.2.1 測(cè)量PHP 應(yīng)用程序
3.3 剖析MySQL 查詢
3.3.1 剖析服務(wù)器負(fù)載
3.3.2 剖析單條查詢
3.3.3 使用性能剖析
3.4 診斷間歇性問題
3.4.1 單條查詢問題還是服務(wù)器問題
3.4.2 捕獲診斷數(shù)據(jù)
3.4.3 一個(gè)診斷案例
3.5 其他剖析工具
3.5.1 使用USER_STATISTICS 表
3.5.2 使用strace
3.6 總結(jié)
第4章 Schema 與數(shù)據(jù)類型優(yōu)化
4.1 選擇優(yōu)化的數(shù)據(jù)類型
4.1.1 整數(shù)類型
4.1.2 實(shí)數(shù)類型
4.1.3 字符串類型
4.1.4 日期和時(shí)間類型
4.1.5 位數(shù)據(jù)類型
4.1.6 選擇標(biāo)識(shí)符(identifier)
4.1.7 特殊類型數(shù)據(jù)
4.2 MySQL schema 設(shè)計(jì)中的陷阱
4.3 范式和反范式
4.3.1 范式的優(yōu)點(diǎn)和缺點(diǎn)
4.3.2 反范式的優(yōu)點(diǎn)和缺點(diǎn) .
4.3.3 混用范式化和反范式化
4.4 緩存表和匯總表
4.4.1 物化視圖
4.4.2 計(jì)數(shù)器表
4.5 加快ALTER TABLE 操作的速度
4.5.1 只修改.frm 文件
4.5.2 快速創(chuàng)建MyISAM 索引
4.6 總結(jié)
第5章 創(chuàng)建高性能的索引
5.1 索引基礎(chǔ)
5.1.1 索引的類型
5.2 索引的優(yōu)點(diǎn)
5.3 高性能的索引策略
5.3.1 獨(dú)立的列
5.3.2 前綴索引和索引選擇性
5.3.3 多列索引
5.3.4 選擇合適的索引列順序
5.3.5 聚簇索引
5.3.6 覆蓋索引
5.3.7 使用索引掃描來做排序
5.3.8 壓縮(前綴壓縮)索引
5.3.9 冗余和重復(fù)索引
5.3.10 未使用的索引
5.3.11 索引和鎖
5.4 索引案例學(xué)習(xí)
5.4.1 支持多種過濾條件
5.4.2 避免多個(gè)范圍條件
5.4.3 優(yōu)化排序
5.5 維護(hù)索引和表
5.5.1 找到并修復(fù)損壞的表 .
5.5.2 更新索引統(tǒng)計(jì)信息
5.5.3 減少索引和數(shù)據(jù)的碎片
5.6 總結(jié)
第6章 查詢性能優(yōu)化
6.1 為什么查詢速度會(huì)慢
6.2 慢查詢基礎(chǔ):優(yōu)化數(shù)據(jù)訪問
6.2.1 是否向服務(wù)器請(qǐng)求了不需要的數(shù)據(jù)
6.2.2 MySQL 是否在掃描額外的記錄
6.3 重構(gòu)查詢的方式
6.3.1 一個(gè)復(fù)雜查詢還是多個(gè)簡(jiǎn)單查詢
6.3.2 切分查詢
6.3.3 分解關(guān)聯(lián)查詢
6.4 查詢執(zhí)行的基礎(chǔ)
6.4.1 MySQL 客戶端/ 服務(wù)器通信協(xié)議
6.4.2 查詢緩存
6.4.3 查詢優(yōu)化處理
6.4.4 查詢執(zhí)行引擎
6.4.5 返回結(jié)果給客戶端
6.5 MySQL 查詢優(yōu)化器的局限性
6.5.1 關(guān)聯(lián)子查詢
6.5.2 UNION 的限制
6.5.3 索引合并優(yōu)化
6.5.4 等值傳遞
6.5.5 并行執(zhí)行
6.5.6 哈希關(guān)聯(lián)
6.5.7 松散索引掃描
6.5.8 最大值和最小值優(yōu)化 .
6.5.9 在同一個(gè)表上查詢和更新
6.6 查詢優(yōu)化器的提示(hint)
6.7 優(yōu)化特定類型的查詢
6.7.1 優(yōu)化COUNT() 查詢
6.7.2 優(yōu)化關(guān)聯(lián)查詢
6.7.3 優(yōu)化子查詢
6.7.4 優(yōu)化GROUP BY 和DISTINCT
6.7.5 優(yōu)化LIMIT 分頁(yè)
6.7.6 優(yōu)化SQL_CALC_FOUND_ROWS
6.7.7 優(yōu)化UNION 查詢
6.7.8 靜態(tài)查詢分析
6.7.9 使用用戶自定義變量 .
6.8 案例學(xué)習(xí)
6.8.1 使用MySQL 構(gòu)建一個(gè)隊(duì)列表
6.8.2 計(jì)算兩點(diǎn)之間的距離 .
6.8.3 使用用戶自定義函數(shù) .
6.9 總結(jié)
第7章 MySQL 高級(jí)特性
7.1 分區(qū)表
7.1.1 分區(qū)表的原理
7.1.2 分區(qū)表的類型
7.1.3 如何使用分區(qū)表
7.1.4 什么情況下會(huì)出問題 .
7.1.5 查詢優(yōu)化
7.1.6 合并表
7.2 視圖
7.2.1 可更新視圖
7.2.2 視圖對(duì)性能的影響
7.2.3 視圖的限制
7.3 外鍵約束
7.4 在MySQL 內(nèi)部存儲(chǔ)代碼
7.4.1 存儲(chǔ)過程和函數(shù)
7.4.2 觸發(fā)器
7.4.3 事件
7.4.4 在存儲(chǔ)程序中保留注釋
7.5 游標(biāo)
7.6 綁定變量
7.6.1 綁定變量的優(yōu)化
7.6.2 SQL 接口的綁定變量
7.6.3 綁定變量的限制
7.7 用戶自定義函數(shù)
7.8 插件
7.9 字符集和校對(duì)
7.9.1 MySQL 如何使用字符集
7.9.2 選擇字符集和校對(duì)規(guī)則
7.9.3 字符集和校對(duì)規(guī)則如何影響查詢
7.10 全文索引
7.10.1 自然語(yǔ)言的全文索引
7.10.2 布爾全文索引
7.10.3 MySQL5.1 中全文索引的變化
7.10.4 全文索引的限制和替代方案
7.10.5 全文索引的配置和優(yōu)化
7.11 分布式(XA)事務(wù)
7.11.1 內(nèi)部XA 事務(wù)
7.11.2 外部XA 事務(wù)
7.12 查詢緩存
7.12.1 MySQL 如何判斷緩存命中
7.12.2 查詢緩存如何使用內(nèi)存
7.12.3 什么情況下查詢緩存能發(fā)揮作用
7.12.4 如何配置和維護(hù)查詢緩存
7.12.5 InnoDB 和查詢緩存 .
7.12.6 通用查詢緩存優(yōu)化
7.12.7 查詢緩存的替代方案
7.13 總結(jié)
第8章 優(yōu)化服務(wù)器設(shè)置
8.1 MySQL 配置的工作原理
8.1.1 語(yǔ)法、作用域和動(dòng)態(tài)性
8.1.2 設(shè)置變量的副作用
8.1.3 入門
8.1.4 通過基準(zhǔn)測(cè)試迭代優(yōu)化
8.2 什么不該做
8.3 創(chuàng)建MySQL 配置文件
8.3.1 檢查MySQL 服務(wù)器狀態(tài)變量
8.4 配置內(nèi)存使用
8.4.1 MySQL 可以使用多少內(nèi)存?
8.4.2 每個(gè)連接需要的內(nèi)存 .
8.4.3 為操作系統(tǒng)保留內(nèi)存 .
8.4.4 為緩存分配內(nèi)存
8.4.5 InnoDB 緩沖池(Buffer Pool)
8.4.6 MyISAM 鍵緩存(Key Caches)
8.4.7 線程緩存
8.4.8 表緩存(Table Cache)
8.4.9 InnoDB 數(shù)據(jù)字典(Data Dictionary)
8.5 配置MySQL 的I/O 行為
8.5.1 InnoDB I/O 配置
8.5.2 MyISAM 的I/O 配置 .
8.6 配置MySQL 并發(fā) .
8.6.1 InnoDB 并發(fā)配置
8.6.2 MyISAM 并發(fā)配置
8.7 基于工作負(fù)載的配置
8.7.1 優(yōu)化BLOB 和TEXT 的場(chǎng)景
8.7.2 優(yōu)化排序(Filesorts).
8.8 完成基本配置
8.9 安全和穩(wěn)定的設(shè)置
8.10 高級(jí)InnoDB 設(shè)置
8.11 總結(jié)
第9章 操作系統(tǒng)和硬件優(yōu)化
9.1 什么限制了MySQL 的性能
9.2 如何為MySQL 選擇CPU
9.2.1 哪個(gè)更好:更快的CPU 還是更多的CPU
9.2.2 CPU 架構(gòu)
9.2.3 擴(kuò)展到多個(gè)CPU 和核心
9.3 平衡內(nèi)存和磁盤資源
9.3.1 隨機(jī)I/O 和順序I/O
9.3.2 緩存,讀和寫
9.3.3 工作集是什么
9.3.4 找到有效的內(nèi)存/ 磁盤比例
9.3.5 選擇硬盤
9.4 固態(tài)存儲(chǔ)
9.4.1 閃存概述
9.4.2 閃存技術(shù)
9.4.3 閃存的基準(zhǔn)測(cè)試
9.4.4 固態(tài)硬盤驅(qū)動(dòng)器(SSD)
9.4.5 PCIe 存儲(chǔ)設(shè)備
9.4.6 其他類型的固態(tài)存儲(chǔ) .
9.4.7 什么時(shí)候應(yīng)該使用閃存
9.4.8 使用Flashcache
9.4.9 優(yōu)化固態(tài)存儲(chǔ)上的MySQL
9.5 為備庫(kù)選擇硬件
9.6 RAID 性能優(yōu)化
9.6.1 RAID 的故障轉(zhuǎn)移、恢復(fù)和鏡像
9.6.2 平衡硬件RAID 和軟件RAID
9.6.3 RAID 配置和緩存
9.7 SAN 和NAS
9.7.1 SAN 基準(zhǔn)測(cè)試
9.7.2 使用基于NFS 或SMB 的SAN
9.7.3 MySQL 在SAN 上的性能
9.7.4 應(yīng)該用SAN 嗎
9.8 使用多磁盤卷
9.9 網(wǎng)絡(luò)配置
9.10 選擇操作系統(tǒng)
9.11 選擇文件系統(tǒng)
9.12 選擇磁盤隊(duì)列調(diào)度策略
9.13 線程
9.14 內(nèi)存交換區(qū)
9.15 操作系統(tǒng)狀態(tài)
9.15.1 如何閱讀vmstat 的輸出
9.15.2 如何閱讀iostat 的輸出
9.15.3 其他有用的工具
9.15.4 CPU 密集型的機(jī)器
9.15.5 I/O 密集型的機(jī)器
9.15.6 發(fā)生內(nèi)存交換的機(jī)器
9.15.7 空閑的機(jī)器
9.16 總結(jié)
第10章 復(fù)制
10.1 復(fù)制概述
10.1.1 復(fù)制解決的問題
10.1.2 復(fù)制如何工作
10.2 配置復(fù)制
10.2.1 創(chuàng)建復(fù)制賬號(hào)
10.2.2 配置主庫(kù)和備庫(kù)
10.2.3 啟動(dòng)復(fù)制
10.2.4 從另一個(gè)服務(wù)器開始復(fù)制
10.2.5 推薦的復(fù)制配置
10.3 復(fù)制的原理
10.3.1 基于語(yǔ)句的復(fù)制
10.3.2 基于行的復(fù)制
10.3.3 基于行或基于語(yǔ)句:哪種更優(yōu)
10.3.4 復(fù)制文件
10.3.5 發(fā)送復(fù)制事件到其他備庫(kù)
10.3.6 復(fù)制過濾器
10.4 復(fù)制拓?fù)?
10.4.1 一主庫(kù)多備庫(kù)
10.4.2 主動(dòng)- 主動(dòng)模式下的主- 主復(fù)制
10.4.3 主動(dòng)- 被動(dòng)模式下的主- 主復(fù)制
10.4.4 擁有備庫(kù)的主- 主結(jié)構(gòu)
10.4.5 環(huán)形復(fù)制
10.4.6 主庫(kù)、分發(fā)主庫(kù)以及備庫(kù)
10.4.7 樹或金字塔形
10.4.8 定制的復(fù)制方案
10.5 復(fù)制和容量規(guī)劃
10.5.1 為什么復(fù)制無法擴(kuò)展寫操作
10.5.2 備庫(kù)什么時(shí)候開始延遲
10.5.3 規(guī)劃冗余容量
10.6 復(fù)制管理和維護(hù)
10.6.1 監(jiān)控復(fù)制
10.6.2 測(cè)量備庫(kù)延遲
10.6.3 確定主備是否一致
10.6.4 從主庫(kù)重新同步備庫(kù)
10.6.5 改變主庫(kù)
10.6.6 在一個(gè)主- 主配置中交換角色
10.7 復(fù)制的問題和解決方案
10.7.1 數(shù)據(jù)損壞或丟失的錯(cuò)誤
10.7.2 使用非事務(wù)型表
10.7.3 混合事務(wù)型和非事務(wù)型表
10.7.4 不確定語(yǔ)句
10.7.5 主庫(kù)和備庫(kù)使用不同的存儲(chǔ)引擎
10.7.6 備庫(kù)發(fā)生數(shù)據(jù)改變
10.7.7 不唯一的服務(wù)器ID .
10.7.8 未定義的服務(wù)器ID .
10.7.9 對(duì)未復(fù)制數(shù)據(jù)的依賴性
10.7.10 丟失的臨時(shí)表
10.7.11 不復(fù)制所有的更新 .
10.7.12 InnoDB 加鎖讀引起的鎖爭(zhēng)用
10.7.13 在主- 主復(fù)制結(jié)構(gòu)中寫入兩臺(tái)主庫(kù)
10.7.14 過大的復(fù)制延遲
10.7.15 來自主庫(kù)的過大的包
10.7.16 受限制的復(fù)制帶寬 .
10.7.17 磁盤空間不足
10.7.18 復(fù)制的局限性
10.8 復(fù)制有多快
10.9 MySQL 復(fù)制的高級(jí)特性
10.10 其他復(fù)制技術(shù)
10.11 總結(jié)
第11章 可擴(kuò)展的MySQL
11.1 什么是可擴(kuò)展性
11.1.1 正式的可擴(kuò)展性定義
11.2 擴(kuò)展MySQL
11.2.1 規(guī)劃可擴(kuò)展性
11.2.2 為擴(kuò)展贏得時(shí)間
11.2.3 向上擴(kuò)展
11.2.4 向外擴(kuò)展
11.2.5 通過多實(shí)例擴(kuò)展
11.2.6 通過集群擴(kuò)展
11.2.7 向內(nèi)擴(kuò)展
11.3 負(fù)載均衡
11.3.1 直接連接
11.3.2 引入中間件
11.3.3 一主多備間的負(fù)載均衡
11.4 總結(jié)
第12章 高可用性
12.1 什么是高可用性
12.2 導(dǎo)致宕機(jī)的原因
12.3 如何實(shí)現(xiàn)高可用性
12.3.1 提升平均失效時(shí)間(MTBF)
12.3.2 降低平均恢復(fù)時(shí)間(MTTR)
12.4 避免單點(diǎn)失效
12.4.1 共享存儲(chǔ)或磁盤復(fù)制
12.4.2 MySQL 同步復(fù)制
12.4.3 基于復(fù)制的冗余
12.5 故障轉(zhuǎn)移和故障恢復(fù)
12.5.1 提升備庫(kù)或切換角色
12.5.2 虛擬IP 地址或IP 接管
12.5.3 中間件解決方案
12.5.4 在應(yīng)用中處理故障轉(zhuǎn)移
12.6 總結(jié)
第13章 云端的MySQL
13.1 云的優(yōu)點(diǎn)、缺點(diǎn)和相關(guān)誤解
13.2 MySQL 在云端的經(jīng)濟(jì)價(jià)值
13.3 云中的MySQL 的可擴(kuò)展性和高可用性
13.4 四種基礎(chǔ)資源
13.5 MySQL 在云主機(jī)上的性能
13.5.1 在云端的MySQL 基準(zhǔn)測(cè)試
13.6 MySQL 數(shù)據(jù)庫(kù)即服務(wù)(DBaaS)
13.6.1 Amazon RDS
13.6.2 其他DBaaS 解決方案
13.7 總結(jié)
第14章 應(yīng)用層優(yōu)化
14.1 常見問題
14.2 Web 服務(wù)器問題
14.2.1 尋找最優(yōu)并發(fā)度
14.3 緩存
14.3.1 應(yīng)用層以下的緩存
14.3.2 應(yīng)用層緩存
14.3.3 緩存控制策略
14.3.4 緩存對(duì)象分層
14.3.5 預(yù)生成內(nèi)容
14.3.6 作為基礎(chǔ)組件的緩存
14.3.7 使用HandlerSocket 和memcached
14.4 拓展MySQL
14.5 MySQL 的替代品
14.6 總結(jié)
第15章 備份與恢復(fù)
15.1 為什么要備份
15.2 定義恢復(fù)需求
15.3 設(shè)計(jì)MySQL 備份方案
15.3.1 在線備份還是離線備份
15.3.2 邏輯備份還是物理備份
15.3.3 備份什么
15.3.4 存儲(chǔ)引擎和一致性
15.4 管理和備份二進(jìn)制日志
15.4.1 二進(jìn)制日志格式
15.4.2 安全地清除老的二進(jìn)制日志
15.5 備份數(shù)據(jù)
15.5.1 生成邏輯備份
15.5.2 文件系統(tǒng)快照
15.6 從備份中恢復(fù)
15.6.1 恢復(fù)物理備份
15.6.2 還原邏輯備份
15.6.3 基于時(shí)間點(diǎn)的恢復(fù)
15.6.4 更高級(jí)的恢復(fù)技術(shù)
15.6.5 InnoDB 崩潰恢復(fù)
15.7 備份和恢復(fù)工具
15.7.1 MySQL Enterprise Backup
15.7.2 Percona XtraBackup .
15.7.3 mylvmbackup
15.7.4 Zmanda Recovery Manager
15.7.5 mydumper
15.7.6 mysqldump.
15.8 備份腳本化
15.9 總結(jié)
第16章 MySQL 用戶工具
16.1 接口工具
16.2 命令行工具集
16.3 SQL 實(shí)用集
16.4 監(jiān)測(cè)工具
16.4.1 開源的監(jiān)控工具
16.4.2 商業(yè)監(jiān)控系統(tǒng)
16.4.3 Innotop 的命令行監(jiān)控
16.5 總結(jié)
附錄A MySQL 分支與變種
附錄B MySQL 服務(wù)器狀態(tài)
附錄C 大文件傳輸
附錄D EXPLAIN
附錄E 鎖的調(diào)試
附錄F 在MySQL 上使用Sphinx
索引
第一個(gè)趨勢(shì),采用了InnoDB plugin的版本,在高并發(fā)的時(shí)候性能明顯更好,可以說InnoDB plugin的擴(kuò)展性更好。這是可以預(yù)期的結(jié)果,舊的版本在高并發(fā)時(shí)確實(shí)存在問題。第二個(gè)趨勢(shì),新的版本在單線程的時(shí)候性能比舊版本更差。一開始可能無法理解為什么會(huì)這樣,仔細(xì)想想就能明白,這是一個(gè)非常簡(jiǎn)單的只讀測(cè)試。新版本的SQL語(yǔ)法更復(fù)雜,針對(duì)復(fù)雜查詢?cè)黾恿撕芏嗵匦院透倪M(jìn),這對(duì)于簡(jiǎn)單查詢可能帶來了更多的開銷。舊版本的代碼簡(jiǎn)單,對(duì)于簡(jiǎn)單的查詢反而會(huì)更有利。原計(jì)劃做一個(gè)更復(fù)雜的不同并發(fā)條件下的讀寫混合場(chǎng)景的測(cè)試(類似TPC—C),但要在不同版本間做到可比較基本是不可能的。一般來說,新版本在復(fù)雜場(chǎng)景時(shí)性能有更多的優(yōu)化,尤其是高并發(fā)和大數(shù)據(jù)集的情況下。
那么該如何選擇版本呢?這更多地取決于業(yè)務(wù)需求而不是技術(shù)需求。理想情況下當(dāng)然是版本越新越好,當(dāng)然也可以選擇等到第一個(gè)bug修復(fù)版本以后再采用新的大版本。如果應(yīng)用還沒有上線,也可以采用即將發(fā)布的新版本,以盡可能地延遲應(yīng)用上線后的升級(jí)操作。
1.7 MySQL的開發(fā)模式
MySQL的開發(fā)過程和發(fā)布模型在不同的階段有很大的變化,但目前已經(jīng)基本穩(wěn)定下來。在Oracle定期發(fā)布的新里程碑開發(fā)版本中,會(huì)包含即將在下一個(gè)GA版本發(fā)布的新特性。這樣做是為了測(cè)試和獲得反饋,請(qǐng)不要在生產(chǎn)環(huán)境使用此版本,雖然Oracle宣稱每個(gè)里程碑版本的質(zhì)量都是可靠的,并隨時(shí)可以正式發(fā)布(到目前為止也沒有任何理由去推翻這個(gè)說法)。Oracle也會(huì)定期發(fā)布實(shí)驗(yàn)室預(yù)覽版,主要包含一些特定的需要評(píng)估的特性,這些特性并不保證會(huì)在下一個(gè)正式版本中包括進(jìn)去。最終,Oracle會(huì)將穩(wěn)定的特性打包發(fā)布一個(gè)新的GA版本。
MySQL依然遵循GPL開源協(xié)議,全部的源代碼(除了一些商業(yè)版本的插件)都會(huì)開放給社區(qū)。Oracle似乎也理解,為社區(qū)和付費(fèi)用戶提供不同的版本并非明智之舉。MySQLAB曾經(jīng)嘗試過不同版本的策略,結(jié)果導(dǎo)致付費(fèi)用戶變成了“睜眼瞎”,無法從社區(qū)的測(cè)試和反饋中獲得好處。不同版本的策略并不受企業(yè)用戶的歡迎,所以后來被Sun廢除了?,F(xiàn)在Oracle為付費(fèi)用戶單獨(dú)提供了一些服務(wù)器插件,而MySQL本身還是遵循開源模式。盡管對(duì)于私有的服務(wù)器插件的發(fā)布有一些抱怨,但這只是少數(shù)的聲音,并且慢慢地在平息。
……
我們寫這本書不僅僅是為了滿足MySQL 應(yīng)用開發(fā)者的需求,也是為了滿足MySQL 數(shù)據(jù)庫(kù)管理員的需要。我們假定讀者已經(jīng)有了一定的MySQL 基礎(chǔ)。我們還假定讀者對(duì)于系統(tǒng)管理、網(wǎng)絡(luò)和類Unix 的操作系統(tǒng)都有一些了解。
本書的第二版為讀者提供了大量的信息,但沒有一本書是可以涵蓋一個(gè)主題的所有方面的。在第二版和第三版之間的這段時(shí)間里,我們記錄了數(shù)以千計(jì)有趣的問題,其中有些是我們解決的,也有一些是我們觀察到其他人解決的。當(dāng)我們?cè)谝?guī)劃第三版的時(shí)候發(fā)現(xiàn),如果要把這些主題完全覆蓋,可能三千頁(yè)到五千頁(yè)的篇幅都還不夠,這樣本書的完成就遙遙無期了。在反思這個(gè)問題后,我們意識(shí)到第二版強(qiáng)調(diào)的廣泛的覆蓋度事實(shí)上有其自身的限制,從某種意義上來說也沒有引導(dǎo)讀者如何按照MySQL 的方式來思考問題。
所以第三版和第二版的關(guān)注點(diǎn)有很大的不同。我們雖然還是會(huì)包含很多的信息,并且會(huì)強(qiáng)調(diào)同樣的諸如可靠性和正確性的目標(biāo),但我們也會(huì)在本書中嘗試更深入的討論:我們會(huì)指出MySQL 為什么會(huì)這樣做,而不是MySQL 做了什么。我們會(huì)使用更多的演示和案例學(xué)習(xí)來將上述原則落地。通過這樣的方式,我們希望能夠嘗試回到下面這樣的問題:“給出MySQL 的內(nèi)部結(jié)構(gòu)和操作,對(duì)于實(shí)際應(yīng)用能帶來什么幫助?為什么能有這樣的幫助?如何讓MySQL 適合(或者不適合)特定的需求?”
最后,我們希望關(guān)于MySQL 內(nèi)部原理的知識(shí)能夠幫助大家解決本書沒有覆蓋到的一些情況。我們更希望讀者能培養(yǎng)發(fā)現(xiàn)新問題的洞察力,能學(xué)習(xí)和實(shí)踐合理的方式來設(shè)計(jì)、維護(hù)和診斷基于MySQL 的系統(tǒng)。
本書是如何組織的
本書涵蓋了許多復(fù)雜的主題。在這里,我們將解釋一下是如何將這些主題有序地組織在一起的,以便于閱讀和學(xué)習(xí)。
概述 第1 章是非?;A(chǔ)的一章,在更深入地學(xué)習(xí)之前建議先熟悉一下這部分內(nèi)容。在有效地使用MySQL 之前應(yīng)當(dāng)理解它是如何組織的。本章解釋了MySQL 的架構(gòu)及其存儲(chǔ)引擎的關(guān)鍵設(shè)計(jì)。如果讀者還不太熟悉關(guān)系數(shù)據(jù)庫(kù)和事務(wù)的基礎(chǔ)知識(shí),本章也可以帶來一點(diǎn)幫助。如果之前已經(jīng)對(duì)其他關(guān)系數(shù)據(jù)庫(kù)如Oracle 比較熟悉,本章也可以幫助讀者了解MySQL 的入門知識(shí)。本章還包括了一點(diǎn)MySQL 的歷史背景:MySQL 隨著時(shí)間的演進(jìn)、最近的公司所有權(quán)更替,以及我們認(rèn)為比較重要的內(nèi)容。
打造堅(jiān)實(shí)的基礎(chǔ)
本書前幾章的內(nèi)容在今后使用MySQL 的過程中可能會(huì)被不斷地引用到,它們是非?;A(chǔ)的內(nèi)容。
第2章討論了基準(zhǔn)測(cè)試的基礎(chǔ),例如服務(wù)器可以處理的工作負(fù)載的類型、處理特定任務(wù)的速度等。基準(zhǔn)測(cè)試是一項(xiàng)至關(guān)重要的技能,可用于評(píng)估服務(wù)器在不同負(fù)載下的表現(xiàn),但也要明白在什么情況下基準(zhǔn)測(cè)試不能發(fā)揮作用。
第3章介紹了我們常用于故障診斷和服務(wù)器性能問題分析的一種面向響應(yīng)時(shí)間的方法。該方法已經(jīng)被證明可以解決我們?cè)龅竭^的一些極為棘手的問題。當(dāng)然也可以選擇修改我們所使用的方法(實(shí)際上我們的方法也是從Cary Millsap 的方法修改而來的),但無論如何,至少不能沒有方法胡亂猜測(cè)。
從第4章到第6 章,連續(xù)介紹了三個(gè)關(guān)于良好的數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)和物理設(shè)計(jì)基礎(chǔ)的話題。第4 章涵蓋了不同數(shù)據(jù)類型的細(xì)節(jié)差別以及表設(shè)計(jì)的原則。第5 章則展開討論了索引,這是數(shù)據(jù)庫(kù)的物理設(shè)計(jì)。對(duì)于索引的深入理解和利用是高效使用MySQL 的基礎(chǔ),相信這一章會(huì)經(jīng)常需要回頭翻看。而第6 章則包含了分析MySQL 的查詢是如何執(zhí)行的,以及如何利用查詢優(yōu)化器的話題。該章也包含了大量常見類型查詢的例子,演示了MySQL 是如何做好工作的,以及如何改寫查詢以利用MySQL 的特性。
到此為止,已經(jīng)覆蓋了關(guān)于數(shù)據(jù)庫(kù)的基礎(chǔ)內(nèi)容:表、索引、數(shù)據(jù)和查詢。第7 章則在MySQL 基礎(chǔ)知識(shí)之外介紹了MySQL 的高級(jí)特性是如何工作的。這章的內(nèi)容包括分區(qū)、存儲(chǔ)引擎、觸發(fā)器,以及字符集。MySQL 中這些特性的實(shí)現(xiàn)可能不同于其他數(shù)據(jù)庫(kù),可能之前讀者并不清楚這些不同,因此理解它們對(duì)于性能可能會(huì)帶來新的收益。
配置應(yīng)用程序
接下來的兩章講述的是如何讓MySQL、應(yīng)用程序及硬件一起很好地工作。第8 章介紹了如何配置MySQL,以便更好地利用硬件,達(dá)到更好的可靠性和魯棒性。第9 章解釋了如何讓操作系統(tǒng)和硬件工作得更好。另外也深入討論了固態(tài)硬盤,為高可擴(kuò)展性應(yīng)用發(fā)揮更好的性能提供了硬件配置的建議。
上面兩章都一定程度地涉及了MySQL 的內(nèi)部知識(shí)。這將會(huì)是一個(gè)反復(fù)出現(xiàn)的主題,附錄中也會(huì)有相關(guān)內(nèi)容可以學(xué)習(xí)到MySQL 的內(nèi)部是如何實(shí)現(xiàn)的,理解了這些知識(shí)將幫助讀者更好地理解某些現(xiàn)象背后的原理。
作為基礎(chǔ)設(shè)施組件的MySQL
MySQL 不是存在于真空中的,而是應(yīng)用整體的一個(gè)環(huán)節(jié),因此需要考慮整個(gè)應(yīng)用架構(gòu)的魯棒性。下面的章節(jié)將告訴我們?cè)撊绾巫龅竭@一點(diǎn)。
第10 章討論了MySQL 的殺手級(jí)特性:能夠設(shè)置多個(gè)服務(wù)器從一臺(tái)主服務(wù)器同步數(shù)據(jù)。不幸的是,復(fù)制可能也是MySQL 給很多用戶帶來困擾的一個(gè)特性。但實(shí)際上不應(yīng)該發(fā)生這樣的情況,本章將告訴你如何讓復(fù)制運(yùn)行得更好。
第11章討論了什么是可擴(kuò)展性(這和性能不是一回事),應(yīng)用和系統(tǒng)為什么會(huì)無法擴(kuò)展,該怎么改善擴(kuò)展性。如果能夠正確地處理,MySQL 的可擴(kuò)展性是足以應(yīng)付任何需求的。
第12章講述的是和可擴(kuò)展性相關(guān)但又完全不同的主題:如何保障MySQL 穩(wěn)定而正確地持續(xù)運(yùn)行。
第13 章將告訴你當(dāng)MySQL 在云計(jì)算環(huán)境中運(yùn)行時(shí)會(huì)有什么不同的事情發(fā)生。
第14章解釋了什么是全方位的優(yōu)化(full-stack optimization),就是從前端到后端的整體優(yōu)化,從用戶體驗(yàn)開始直到數(shù)據(jù)庫(kù)。
即使是世界上設(shè)計(jì)最好、最具可擴(kuò)展性的架構(gòu),如果停電會(huì)導(dǎo)致徹底崩潰,無法抵御惡意攻擊,解決不了應(yīng)用的bug 和程序員的錯(cuò)誤,以及其他一些災(zāi)難場(chǎng)景,那就不是什么好的架構(gòu)。第15 章討論了MySQL 數(shù)據(jù)庫(kù)各種備份與恢復(fù)的場(chǎng)景。這些策略可以幫助讀者減少在各種不可抗的硬件失效時(shí)的宕機(jī)時(shí)間,保證在各種災(zāi)難下的數(shù)據(jù)最終可恢復(fù)。
其他有用的主題 在本書的最后一章以及附錄中,我們探討了一些無法明確地放到前面章節(jié)的內(nèi)容,以及一些被前面多個(gè)章節(jié)引用而需要特別注意的主題。
第16章探索了一些可以幫助用戶更有效地管理和監(jiān)控MySQL 服務(wù)器的工具,有些是開源的,也有些是商業(yè)的。
附錄A 介紹了近年來成長(zhǎng)迅速的三個(gè)主要的非MySQL 官方版本,其中一個(gè)是我們公司在維護(hù)的產(chǎn)品。知道還有其他什么是可用的選擇是有價(jià)值的;很多MySQL 難以解決的棘手問題在其他的變種版本中說不定就不是問題了。這三個(gè)版本中的兩個(gè)(Percona Server 和MariaDB)是MySQL 的完全可替換版本,所以嘗試使用的成本相對(duì)來說是很低的。當(dāng)然,在這里我們也需要補(bǔ)充一點(diǎn),Oracle 提供的MySQL 官方版本對(duì)于大多數(shù)用戶來說都能服務(wù)得很好。
附錄B 演示了如何檢查MySQL 服務(wù)器。知道如何從服務(wù)器獲取狀態(tài)信息是非常重要的;而了解這些狀態(tài)代表的意義則更加重要。這里將覆蓋SHOW INNODB STATUS 的輸出結(jié)果,因此這里包含了InnoDB 事務(wù)存儲(chǔ)引擎的深入信息。在這個(gè)附錄中討論了很多InnoDB的內(nèi)部信息。
附錄C 演示了如何高效地將大文件從一個(gè)地方復(fù)制到另外一個(gè)地方。如果要管理大量的數(shù)據(jù),這種操作是經(jīng)常都會(huì)碰到的。附錄D 演示了如何真正地使用并理解EXPLAIN 命令。附錄E 演示了如何破除不同查詢所請(qǐng)求的鎖互相干擾的問題。最后,附錄F 介紹了Sphinx,一個(gè)基于MySQL 的高性能的全文索引系統(tǒng)。
更多建議: