高性能MySQL(第3版)(博文視點出品)

2021-04-21 17:37 更新

高性能MySQL(第3版)(博文視點出品)

Baron Schwartz,Peter Zaitsev,Vadim Tkachenko 著,寧海元,周振興,彭立勛 等 譯

  • 出版社: 電子工業(yè)出版社
  • ISBN:9787121198854
  • 版次:3
  • 商品編碼:11220393
  • 品牌:博文視點
  • 包裝:平裝
  • 開本:16開
  • 出版時間:2013-04-01
  • 用紙:膠版紙
  • 頁數(shù):764
  • 正文語種:中文


點此購買


編輯推薦

“只要你不敢以MySQL專家自詡,又豈敢錯過這本神書?”

“一言以蔽之,寫得好,編排得好,需要參考時容易到爆!”

“我可是從頭到尾看了一遍上一版,可還是毫不猶豫拿起了這本《高性能MySQL(第3版)》,而且看完后一點都不后悔……”  

◎ 學(xué)習(xí)MySQL新特性,包括存儲引擎、分區(qū)數(shù)據(jù)庫、觸發(fā)器和視圖

◎ 實現(xiàn)復(fù)制的改進(jìn)、高可用和集群

◎ 獲得在云端運(yùn)行MySQL的高性能

◎ 優(yōu)化高級查詢特性,如全文索引

◎ 從現(xiàn)代的多核CPU和固態(tài)硬盤中獲益

◎ 探索備份和恢復(fù)的策略,包括新的在線備份工具


內(nèi)容簡介

  《高性能MySQL(第3版)》是MySQL 領(lǐng)域的經(jīng)典之作,擁有廣泛的影響力。第3 版更新了大量的內(nèi)容,不但涵蓋了MySQL5.5版本的新特性,也講述了關(guān)于固態(tài)盤、高可擴(kuò)展性設(shè)計和云計算環(huán)境下的數(shù)據(jù)庫相關(guān)的新內(nèi)容,原有的基準(zhǔn)測試和性能優(yōu)化部分也做了大量的擴(kuò)展和補(bǔ)充。全書共分為16章和6 個附錄,內(nèi)容涵蓋MySQL架構(gòu)和歷史,基準(zhǔn)測試和性能剖析,數(shù)據(jù)庫軟硬件性能優(yōu)化,復(fù)制、備份和恢復(fù),高可用與高可擴(kuò)展性,以及云端的MySQL和MySQL相關(guān)工具等方面的內(nèi)容。每一章都是相對獨(dú)立的主題,讀者可以有選擇性地單獨(dú)閱讀。

  《高性能MySQL(第3版)》不但適合數(shù)據(jù)庫管理員(DBA)閱讀,也適合開發(fā)人員參考學(xué)習(xí)。不管是數(shù)據(jù)庫新手還是專家,相信都能從本書有所收獲。


作者簡介

BaronSchwartz是一位軟件工程師,居住在弗吉尼亞州的Charlottesville,網(wǎng)絡(luò)常用名是Xaprb,這是按照QWERTY鍵盤的順序在Dvorak鍵盤上打出來的名字。在不忙于解決有趣的編程挑戰(zhàn)時,Baron會和他的妻子Lynn以及小狗Carbon一起享受閑暇的時光。他有一個軟件工程方面的博客。

  PeterZaitsev曾經(jīng)是MySQLAB公司高性能組的經(jīng)理,目前在運(yùn)作mysqlperformanceblog.com網(wǎng)站。他擅長于幫助那些每天有數(shù)以百萬計訪問量的網(wǎng)站的管理員解決問題,這些網(wǎng)站通常需要幾百臺機(jī)器來處理TB級的數(shù)據(jù)。他常常為了解決一個問題而不停地升級硬件和軟件(比如查詢優(yōu)化)。Peter還經(jīng)常在各種會議上演講。

  VadimTkachenko曾經(jīng)是MySQLAB公司的性能工程師。作為一名在多線程編程和同步方面的專家,他的主要工作是基準(zhǔn)測試、性能剖析,以及找出系統(tǒng)的性能瓶頸。他還在性能監(jiān)控和調(diào)優(yōu)方面做了一些工作,使得MySQL在多核機(jī)器上有更好的可擴(kuò)展性。

  譯者簡介

  寧海元有超過十年的數(shù)據(jù)庫管理經(jīng)驗,從最初的SQLServer2000到Oracle再到MySQL,擅長數(shù)據(jù)庫高可用架構(gòu)、性能優(yōu)化和故障診斷。2007年加入*,帶領(lǐng)*DBA團(tuán)隊完成了數(shù)據(jù)庫的垂直拆分、水平拆分,遷移到MySQL體系等主要工作,為*業(yè)務(wù)的快速增長提供支撐。目前專注于無線數(shù)據(jù)領(lǐng)域。網(wǎng)絡(luò)常用名NinGoo,

  周振興畢業(yè)于北京師范大學(xué)數(shù)學(xué)系,2009年加入*數(shù)據(jù)庫團(tuán)隊,負(fù)責(zé)MySQL運(yùn)維管理工作,有豐富的MySQL性能優(yōu)化、Troubleshooting經(jīng)驗,對MySQL主要模塊的實現(xiàn)和原理有深入的研究,經(jīng)歷了*MySQL實例從30到3000的發(fā)展,對系統(tǒng)架構(gòu)、高可用環(huán)境規(guī)劃都有深入理解。

  彭立勛2010年大學(xué)畢業(yè)后加入********運(yùn)維部。作為一名MySQLDBA,在運(yùn)維MySQL的過程中對MySQL和InnoDB的一些功能和缺陷進(jìn)行了補(bǔ)充,編寫了多主復(fù)制和數(shù)據(jù)閃回等補(bǔ)丁。目前在阿里集團(tuán)核心系統(tǒng)研發(fā)部數(shù)據(jù)庫組,專注于MySQL數(shù)據(jù)庫相關(guān)的開發(fā)工作。后來一些補(bǔ)丁被MySQL之父Mony看中,多主復(fù)制、線程內(nèi)存監(jiān)控等補(bǔ)丁被合并到了MariaDB10.0版本,本人也因此成為MariaDB提交組(Maria-captains)成員。

  翟衛(wèi)祥畢業(yè)于武漢大學(xué),研究生階段從事數(shù)據(jù)庫相關(guān)研究。畢業(yè)后就職數(shù)據(jù)庫技術(shù)團(tuán)隊至今,主要負(fù)責(zé)阿里內(nèi)部MySQL代碼分支維護(hù),包括MySQLBugFix及新特性開發(fā)。對MySQL內(nèi)核有一定的研究。

  劉輝2008年畢業(yè)于西安電子科技大學(xué)計算機(jī)系,碩士學(xué)位。2011年加入數(shù)據(jù)庫技術(shù)團(tuán)隊,花名希羽,MySQL內(nèi)核開發(fā)工程師。


精彩書評

  每一章均別具匠心,力求理論與實踐的精確平衡,且布滿無價之寶,有時甚至越過MySQL舞臺,完全適用于任一數(shù)據(jù)庫。其中第二章“MySQL基準(zhǔn)測試”及第3章“服務(wù)器性能剖析”是非常必要的基礎(chǔ),推薦提前閱讀。

  縱觀全書,作者推薦的工具、實戰(zhàn)案例及經(jīng)驗過的診斷技術(shù),可大大提高你的性能急救技能,以及加深對MySQL本質(zhì)的理解。然而,本書值得推崇的,還是其在探討性能的同時,將數(shù)據(jù)庫結(jié)構(gòu)的客觀方面納入思考,這是其他書里難以看到的。此外,增補(bǔ)的MySQL高可用性及云特性,也讓人更加欣喜。

  相信不少人會因為找不到某些書中引用的資料或工具而苦惱,但從本書中按圖索驥,會發(fā)現(xiàn)這些東西正是作者對MySQL社區(qū)的杰出貢獻(xiàn),也就是說,你可以直接用這些工具!

  很多年前我就是這本書的“粉絲”了,這是一本偉大的書,第三版尤其如此。這些世界*的專家不僅僅分享他們的專業(yè)知識,也花了很多時間來更新和添加新的章節(jié),且都是高品質(zhì)的內(nèi)容。本書有大量關(guān)于如何獲得MySQL高性能的細(xì)節(jié)信息,并且關(guān)注的是提升性能的過程,而不僅僅是描述事實結(jié)果和瑣碎的細(xì)枝末節(jié)。這本書將告訴讀者如何將事情做得更好,不管MySQL在不同版本中的行為有多么大的改變。

  毫無疑問,本書的作者是有資格來寫這么一本書的人,他們經(jīng)驗豐富,有合理的方法,關(guān)注效率,并且精益求精。說到經(jīng)驗豐富,本書的作者已經(jīng)在MySQL性能領(lǐng)域工作多年,從MySQL還沒有什么可擴(kuò)展性和可測量性的時代,直到現(xiàn)在這些方面已經(jīng)有了長足的進(jìn)步。而說到合理的方法,他們簡直把這件事情當(dāng)成了科學(xué),首先定義需要解決的問題,然后通過合理的猜測和精確的測量來解決問題。

  我對作者在效率方面的關(guān)注尤其印象深刻。作為顧問,他們時間寶貴??蛻羰前凑账麄兊臅r間付費(fèi)的,所以都希望能更快地解決問題。所以本書作者定義了一整套的流程,開發(fā)了很多的工具,讓事情變得正確和高效。在本書中,作者詳細(xì)描述了這些流程,并且發(fā)布了工具的源代碼。

  最后,本書作者在工作上一直精益求精。比如從吞吐量到響應(yīng)時間的關(guān)注,致力于了解MySQL在新硬件上的性能表現(xiàn),追求新的技能如排隊理論對性能的影響,等等。我相信本書預(yù)示了MySQL的光明前景。MySQL已經(jīng)支持高要求的工作負(fù)載,本書作者也在努力提升MySQL社區(qū)內(nèi)對性能的認(rèn)識。同時,他們還直接為性能提升做出了貢獻(xiàn),包括XtraDB和XtraBackup。一直以來我從他們身上學(xué)到了不少東西,也希望讀者多花點時間讀讀本書,一定會同樣有所收益。

  ——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 隔離級別
1.3.2 死鎖
1.3.3 事務(wù)日志
1.3.4 MySQL 中的事務(wù)
1.4 多版本并發(fā)控制
1.5 MySQL 的存儲引擎
1.5.1 InnoDB 存儲引擎
1.5.2 MyISAM 存儲引擎
1.5.3 MySQL 內(nèi)建的其他存儲引擎
1.5.4 第三方存儲引擎
1.5.5 選擇合適的引擎
1.5.6 轉(zhuǎn)換表的引擎
1.6 MySQL 時間線(Timeline)
1.7 MySQL 的開發(fā)模式
1.8 總結(jié)

第2章 MySQL 基準(zhǔn)測試
2.1 為什么需要基準(zhǔn)測試
2.2 基準(zhǔn)測試的策略
2.2.1 測試何種指標(biāo)
2.3 基準(zhǔn)測試方法
2.3.1 設(shè)計和規(guī)劃基準(zhǔn)測試
2.3.2 基準(zhǔn)測試應(yīng)該運(yùn)行多長時間
2.3.3 獲取系統(tǒng)性能和狀態(tài)
2.3.4 獲得準(zhǔn)確的測試結(jié)果
2.3.5 運(yùn)行基準(zhǔn)測試并分析結(jié)果
2.3.6 繪圖的重要性
2.4 基準(zhǔn)測試工具
2.4.1 集成式測試工具
2.4.2 單組件式測試工具
2.5 基準(zhǔn)測試案例
2.5.1 http_load
2.5.2 MySQL 基準(zhǔn)測試套件 .
2.5.3 sysbench
2.5.4 數(shù)據(jù)庫測試套件中的dbt2 TPC-C 測試
2.5.5 Percona 的TPCC-MySQL 測試工具
2.6 總結(jié)

第3章 服務(wù)器性能剖析
3.1 性能優(yōu)化簡介
3.1.1 通過性能剖析進(jìn)行優(yōu)化
3.1.2 理解性能剖析
3.2 對應(yīng)用程序進(jìn)行性能剖析
3.2.1 測量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 一個診斷案例
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ù)類型
4.1.3 字符串類型
4.1.4 日期和時間類型
4.1.5 位數(shù)據(jù)類型
4.1.6 選擇標(biāo)識符(identifier)
4.1.7 特殊類型數(shù)據(jù)
4.2 MySQL schema 設(shè)計中的陷阱
4.3 范式和反范式
4.3.1 范式的優(yōu)點和缺點
4.3.2 反范式的優(yōu)點和缺點 .
4.3.3 混用范式化和反范式化
4.4 緩存表和匯總表
4.4.1 物化視圖
4.4.2 計數(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)點
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 避免多個范圍條件
5.4.3 優(yōu)化排序
5.5 維護(hù)索引和表
5.5.1 找到并修復(fù)損壞的表 .
5.5.2 更新索引統(tǒng)計信息
5.5.3 減少索引和數(shù)據(jù)的碎片
5.6 總結(jié)

第6章 查詢性能優(yōu)化
6.1 為什么查詢速度會慢
6.2 慢查詢基礎(chǔ):優(yōu)化數(shù)據(jù)訪問
6.2.1 是否向服務(wù)器請求了不需要的數(shù)據(jù)
6.2.2 MySQL 是否在掃描額外的記錄
6.3 重構(gòu)查詢的方式
6.3.1 一個復(fù)雜查詢還是多個簡單查詢
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 在同一個表上查詢和更新
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 分頁
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)建一個隊列表
6.8.2 計算兩點之間的距離 .
6.8.3 使用用戶自定義函數(shù) .
6.9 總結(jié)

第7章 MySQL 高級特性
7.1 分區(qū)表
7.1.1 分區(qū)表的原理
7.1.2 分區(qū)表的類型
7.1.3 如何使用分區(qū)表
7.1.4 什么情況下會出問題 .
7.1.5 查詢優(yōu)化
7.1.6 合并表
7.2 視圖
7.2.1 可更新視圖
7.2.2 視圖對性能的影響
7.2.3 視圖的限制
7.3 外鍵約束
7.4 在MySQL 內(nèi)部存儲代碼
7.4.1 存儲過程和函數(shù)
7.4.2 觸發(fā)器
7.4.3 事件
7.4.4 在存儲程序中保留注釋
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 字符集和校對
7.9.1 MySQL 如何使用字符集
7.9.2 選擇字符集和校對規(guī)則
7.9.3 字符集和校對規(guī)則如何影響查詢
7.10 全文索引
7.10.1 自然語言的全文索引
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 語法、作用域和動態(tài)性
8.1.2 設(shè)置變量的副作用
8.1.3 入門
8.1.4 通過基準(zhǔn)測試迭代優(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 每個連接需要的內(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 的場景
8.7.2 優(yōu)化排序(Filesorts).
8.8 完成基本配置
8.9 安全和穩(wěn)定的設(shè)置
8.10 高級InnoDB 設(shè)置
8.11 總結(jié)

第9章 操作系統(tǒng)和硬件優(yōu)化
9.1 什么限制了MySQL 的性能
9.2 如何為MySQL 選擇CPU
9.2.1 哪個更好:更快的CPU 還是更多的CPU
9.2.2 CPU 架構(gòu)
9.2.3 擴(kuò)展到多個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)存儲
9.4.1 閃存概述
9.4.2 閃存技術(shù)
9.4.3 閃存的基準(zhǔn)測試
9.4.4 固態(tài)硬盤驅(qū)動器(SSD)
9.4.5 PCIe 存儲設(shè)備
9.4.6 其他類型的固態(tài)存儲 .
9.4.7 什么時候應(yīng)該使用閃存
9.4.8 使用Flashcache
9.4.9 優(yōu)化固態(tài)存儲上的MySQL
9.5 為備庫選擇硬件
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)測試
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 選擇磁盤隊列調(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ù)制賬號
10.2.2 配置主庫和備庫
10.2.3 啟動復(fù)制
10.2.4 從另一個服務(wù)器開始復(fù)制
10.2.5 推薦的復(fù)制配置
10.3 復(fù)制的原理
10.3.1 基于語句的復(fù)制
10.3.2 基于行的復(fù)制
10.3.3 基于行或基于語句:哪種更優(yōu)
10.3.4 復(fù)制文件
10.3.5 發(fā)送復(fù)制事件到其他備庫
10.3.6 復(fù)制過濾器
10.4 復(fù)制拓?fù)?
10.4.1 一主庫多備庫
10.4.2 主動- 主動模式下的主- 主復(fù)制
10.4.3 主動- 被動模式下的主- 主復(fù)制
10.4.4 擁有備庫的主- 主結(jié)構(gòu)
10.4.5 環(huán)形復(fù)制
10.4.6 主庫、分發(fā)主庫以及備庫
10.4.7 樹或金字塔形
10.4.8 定制的復(fù)制方案
10.5 復(fù)制和容量規(guī)劃
10.5.1 為什么復(fù)制無法擴(kuò)展寫操作
10.5.2 備庫什么時候開始延遲
10.5.3 規(guī)劃冗余容量
10.6 復(fù)制管理和維護(hù)
10.6.1 監(jiān)控復(fù)制
10.6.2 測量備庫延遲
10.6.3 確定主備是否一致
10.6.4 從主庫重新同步備庫
10.6.5 改變主庫
10.6.6 在一個主- 主配置中交換角色
10.7 復(fù)制的問題和解決方案
10.7.1 數(shù)據(jù)損壞或丟失的錯誤
10.7.2 使用非事務(wù)型表
10.7.3 混合事務(wù)型和非事務(wù)型表
10.7.4 不確定語句
10.7.5 主庫和備庫使用不同的存儲引擎
10.7.6 備庫發(fā)生數(shù)據(jù)改變
10.7.7 不唯一的服務(wù)器ID .
10.7.8 未定義的服務(wù)器ID .
10.7.9 對未復(fù)制數(shù)據(jù)的依賴性
10.7.10 丟失的臨時表
10.7.11 不復(fù)制所有的更新 .
10.7.12 InnoDB 加鎖讀引起的鎖爭用
10.7.13 在主- 主復(fù)制結(jié)構(gòu)中寫入兩臺主庫
10.7.14 過大的復(fù)制延遲
10.7.15 來自主庫的過大的包
10.7.16 受限制的復(fù)制帶寬 .
10.7.17 磁盤空間不足
10.7.18 復(fù)制的局限性
10.8 復(fù)制有多快
10.9 MySQL 復(fù)制的高級特性
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ò)展贏得時間
11.2.3 向上擴(kuò)展
11.2.4 向外擴(kuò)展
11.2.5 通過多實例擴(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 如何實現(xiàn)高可用性
12.3.1 提升平均失效時間(MTBF)
12.3.2 降低平均恢復(fù)時間(MTTR)
12.4 避免單點失效
12.4.1 共享存儲或磁盤復(fù)制
12.4.2 MySQL 同步復(fù)制
12.4.3 基于復(fù)制的冗余
12.5 故障轉(zhuǎn)移和故障恢復(fù)
12.5.1 提升備庫或切換角色
12.5.2 虛擬IP 地址或IP 接管
12.5.3 中間件解決方案
12.5.4 在應(yīng)用中處理故障轉(zhuǎn)移
12.6 總結(jié)

第13章 云端的MySQL
13.1 云的優(yōu)點、缺點和相關(guān)誤解
13.2 MySQL 在云端的經(jīng)濟(jì)價值
13.3 云中的MySQL 的可擴(kuò)展性和高可用性
13.4 四種基礎(chǔ)資源
13.5 MySQL 在云主機(jī)上的性能
13.5.1 在云端的MySQL 基準(zhǔn)測試
13.6 MySQL 數(shù)據(jù)庫即服務(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 緩存對象分層
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è)計MySQL 備份方案
15.3.1 在線備份還是離線備份
15.3.2 邏輯備份還是物理備份
15.3.3 備份什么
15.3.4 存儲引擎和一致性
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 基于時間點的恢復(fù)
15.6.4 更高級的恢復(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 實用集
16.4 監(jiān)測工具
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
索引


精彩書摘

  第一個趨勢,采用了InnoDB plugin的版本,在高并發(fā)的時候性能明顯更好,可以說InnoDB plugin的擴(kuò)展性更好。這是可以預(yù)期的結(jié)果,舊的版本在高并發(fā)時確實存在問題。第二個趨勢,新的版本在單線程的時候性能比舊版本更差。一開始可能無法理解為什么會這樣,仔細(xì)想想就能明白,這是一個非常簡單的只讀測試。新版本的SQL語法更復(fù)雜,針對復(fù)雜查詢增加了很多特性和改進(jìn),這對于簡單查詢可能帶來了更多的開銷。舊版本的代碼簡單,對于簡單的查詢反而會更有利。原計劃做一個更復(fù)雜的不同并發(fā)條件下的讀寫混合場景的測試(類似TPC—C),但要在不同版本間做到可比較基本是不可能的。一般來說,新版本在復(fù)雜場景時性能有更多的優(yōu)化,尤其是高并發(fā)和大數(shù)據(jù)集的情況下。

  那么該如何選擇版本呢?這更多地取決于業(yè)務(wù)需求而不是技術(shù)需求。理想情況下當(dāng)然是版本越新越好,當(dāng)然也可以選擇等到第一個bug修復(fù)版本以后再采用新的大版本。如果應(yīng)用還沒有上線,也可以采用即將發(fā)布的新版本,以盡可能地延遲應(yīng)用上線后的升級操作。

  1.7 MySQL的開發(fā)模式

  MySQL的開發(fā)過程和發(fā)布模型在不同的階段有很大的變化,但目前已經(jīng)基本穩(wěn)定下來。在Oracle定期發(fā)布的新里程碑開發(fā)版本中,會包含即將在下一個GA版本發(fā)布的新特性。這樣做是為了測試和獲得反饋,請不要在生產(chǎn)環(huán)境使用此版本,雖然Oracle宣稱每個里程碑版本的質(zhì)量都是可靠的,并隨時可以正式發(fā)布(到目前為止也沒有任何理由去推翻這個說法)。Oracle也會定期發(fā)布實驗室預(yù)覽版,主要包含一些特定的需要評估的特性,這些特性并不保證會在下一個正式版本中包括進(jìn)去。最終,Oracle會將穩(wěn)定的特性打包發(fā)布一個新的GA版本。

  MySQL依然遵循GPL開源協(xié)議,全部的源代碼(除了一些商業(yè)版本的插件)都會開放給社區(qū)。Oracle似乎也理解,為社區(qū)和付費(fèi)用戶提供不同的版本并非明智之舉。MySQLAB曾經(jīng)嘗試過不同版本的策略,結(jié)果導(dǎo)致付費(fèi)用戶變成了“睜眼瞎”,無法從社區(qū)的測試和反饋中獲得好處。不同版本的策略并不受企業(yè)用戶的歡迎,所以后來被Sun廢除了?,F(xiàn)在Oracle為付費(fèi)用戶單獨(dú)提供了一些服務(wù)器插件,而MySQL本身還是遵循開源模式。盡管對于私有的服務(wù)器插件的發(fā)布有一些抱怨,但這只是少數(shù)的聲音,并且慢慢地在平息。

  ……


前言/序言

我們寫這本書不僅僅是為了滿足MySQL 應(yīng)用開發(fā)者的需求,也是為了滿足MySQL 數(shù)據(jù)庫管理員的需要。我們假定讀者已經(jīng)有了一定的MySQL 基礎(chǔ)。我們還假定讀者對于系統(tǒng)管理、網(wǎng)絡(luò)和類Unix 的操作系統(tǒng)都有一些了解。

  本書的第二版為讀者提供了大量的信息,但沒有一本書是可以涵蓋一個主題的所有方面的。在第二版和第三版之間的這段時間里,我們記錄了數(shù)以千計有趣的問題,其中有些是我們解決的,也有一些是我們觀察到其他人解決的。當(dāng)我們在規(guī)劃第三版的時候發(fā)現(xiàn),如果要把這些主題完全覆蓋,可能三千頁到五千頁的篇幅都還不夠,這樣本書的完成就遙遙無期了。在反思這個問題后,我們意識到第二版強(qiáng)調(diào)的廣泛的覆蓋度事實上有其自身的限制,從某種意義上來說也沒有引導(dǎo)讀者如何按照MySQL 的方式來思考問題。

  所以第三版和第二版的關(guān)注點有很大的不同。我們雖然還是會包含很多的信息,并且會強(qiáng)調(diào)同樣的諸如可靠性和正確性的目標(biāo),但我們也會在本書中嘗試更深入的討論:我們會指出MySQL 為什么會這樣做,而不是MySQL 做了什么。我們會使用更多的演示和案例學(xué)習(xí)來將上述原則落地。通過這樣的方式,我們希望能夠嘗試回到下面這樣的問題:“給出MySQL 的內(nèi)部結(jié)構(gòu)和操作,對于實際應(yīng)用能帶來什么幫助?為什么能有這樣的幫助?如何讓MySQL 適合(或者不適合)特定的需求?”

  最后,我們希望關(guān)于MySQL 內(nèi)部原理的知識能夠幫助大家解決本書沒有覆蓋到的一些情況。我們更希望讀者能培養(yǎng)發(fā)現(xiàn)新問題的洞察力,能學(xué)習(xí)和實踐合理的方式來設(shè)計、維護(hù)和診斷基于MySQL 的系統(tǒng)。

  本書是如何組織的

  本書涵蓋了許多復(fù)雜的主題。在這里,我們將解釋一下是如何將這些主題有序地組織在一起的,以便于閱讀和學(xué)習(xí)。

  概述  第1 章是非?;A(chǔ)的一章,在更深入地學(xué)習(xí)之前建議先熟悉一下這部分內(nèi)容。在有效地使用MySQL 之前應(yīng)當(dāng)理解它是如何組織的。本章解釋了MySQL 的架構(gòu)及其存儲引擎的關(guān)鍵設(shè)計。如果讀者還不太熟悉關(guān)系數(shù)據(jù)庫和事務(wù)的基礎(chǔ)知識,本章也可以帶來一點幫助。如果之前已經(jīng)對其他關(guān)系數(shù)據(jù)庫如Oracle 比較熟悉,本章也可以幫助讀者了解MySQL 的入門知識。本章還包括了一點MySQL 的歷史背景:MySQL 隨著時間的演進(jìn)、最近的公司所有權(quán)更替,以及我們認(rèn)為比較重要的內(nèi)容。

  打造堅實的基礎(chǔ)

  本書前幾章的內(nèi)容在今后使用MySQL 的過程中可能會被不斷地引用到,它們是非常基礎(chǔ)的內(nèi)容。

  第2章討論了基準(zhǔn)測試的基礎(chǔ),例如服務(wù)器可以處理的工作負(fù)載的類型、處理特定任務(wù)的速度等?;鶞?zhǔn)測試是一項至關(guān)重要的技能,可用于評估服務(wù)器在不同負(fù)載下的表現(xiàn),但也要明白在什么情況下基準(zhǔn)測試不能發(fā)揮作用。

  第3章介紹了我們常用于故障診斷和服務(wù)器性能問題分析的一種面向響應(yīng)時間的方法。該方法已經(jīng)被證明可以解決我們曾碰到過的一些極為棘手的問題。當(dāng)然也可以選擇修改我們所使用的方法(實際上我們的方法也是從Cary Millsap 的方法修改而來的),但無論如何,至少不能沒有方法胡亂猜測。

  從第4章到第6 章,連續(xù)介紹了三個關(guān)于良好的數(shù)據(jù)庫邏輯設(shè)計和物理設(shè)計基礎(chǔ)的話題。第4 章涵蓋了不同數(shù)據(jù)類型的細(xì)節(jié)差別以及表設(shè)計的原則。第5 章則展開討論了索引,這是數(shù)據(jù)庫的物理設(shè)計。對于索引的深入理解和利用是高效使用MySQL 的基礎(chǔ),相信這一章會經(jīng)常需要回頭翻看。而第6 章則包含了分析MySQL 的查詢是如何執(zhí)行的,以及如何利用查詢優(yōu)化器的話題。該章也包含了大量常見類型查詢的例子,演示了MySQL 是如何做好工作的,以及如何改寫查詢以利用MySQL 的特性。

  到此為止,已經(jīng)覆蓋了關(guān)于數(shù)據(jù)庫的基礎(chǔ)內(nèi)容:表、索引、數(shù)據(jù)和查詢。第7 章則在MySQL 基礎(chǔ)知識之外介紹了MySQL 的高級特性是如何工作的。這章的內(nèi)容包括分區(qū)、存儲引擎、觸發(fā)器,以及字符集。MySQL 中這些特性的實現(xiàn)可能不同于其他數(shù)據(jù)庫,可能之前讀者并不清楚這些不同,因此理解它們對于性能可能會帶來新的收益。

  配置應(yīng)用程序

  接下來的兩章講述的是如何讓MySQL、應(yīng)用程序及硬件一起很好地工作。第8 章介紹了如何配置MySQL,以便更好地利用硬件,達(dá)到更好的可靠性和魯棒性。第9 章解釋了如何讓操作系統(tǒng)和硬件工作得更好。另外也深入討論了固態(tài)硬盤,為高可擴(kuò)展性應(yīng)用發(fā)揮更好的性能提供了硬件配置的建議。

  上面兩章都一定程度地涉及了MySQL 的內(nèi)部知識。這將會是一個反復(fù)出現(xiàn)的主題,附錄中也會有相關(guān)內(nèi)容可以學(xué)習(xí)到MySQL 的內(nèi)部是如何實現(xiàn)的,理解了這些知識將幫助讀者更好地理解某些現(xiàn)象背后的原理。

  作為基礎(chǔ)設(shè)施組件的MySQL

  MySQL 不是存在于真空中的,而是應(yīng)用整體的一個環(huán)節(jié),因此需要考慮整個應(yīng)用架構(gòu)的魯棒性。下面的章節(jié)將告訴我們該如何做到這一點。

  第10 章討論了MySQL 的殺手級特性:能夠設(shè)置多個服務(wù)器從一臺主服務(wù)器同步數(shù)據(jù)。不幸的是,復(fù)制可能也是MySQL 給很多用戶帶來困擾的一個特性。但實際上不應(yīng)該發(fā)生這樣的情況,本章將告訴你如何讓復(fù)制運(yùn)行得更好。

  第11章討論了什么是可擴(kuò)展性(這和性能不是一回事),應(yīng)用和系統(tǒng)為什么會無法擴(kuò)展,該怎么改善擴(kuò)展性。如果能夠正確地處理,MySQL 的可擴(kuò)展性是足以應(yīng)付任何需求的。

  第12章講述的是和可擴(kuò)展性相關(guān)但又完全不同的主題:如何保障MySQL 穩(wěn)定而正確地持續(xù)運(yùn)行。

       第13 章將告訴你當(dāng)MySQL 在云計算環(huán)境中運(yùn)行時會有什么不同的事情發(fā)生。

  第14章解釋了什么是全方位的優(yōu)化(full-stack optimization),就是從前端到后端的整體優(yōu)化,從用戶體驗開始直到數(shù)據(jù)庫。

  即使是世界上設(shè)計最好、最具可擴(kuò)展性的架構(gòu),如果停電會導(dǎo)致徹底崩潰,無法抵御惡意攻擊,解決不了應(yīng)用的bug 和程序員的錯誤,以及其他一些災(zāi)難場景,那就不是什么好的架構(gòu)。第15 章討論了MySQL 數(shù)據(jù)庫各種備份與恢復(fù)的場景。這些策略可以幫助讀者減少在各種不可抗的硬件失效時的宕機(jī)時間,保證在各種災(zāi)難下的數(shù)據(jù)最終可恢復(fù)。

  其他有用的主題  在本書的最后一章以及附錄中,我們探討了一些無法明確地放到前面章節(jié)的內(nèi)容,以及一些被前面多個章節(jié)引用而需要特別注意的主題。

  第16章探索了一些可以幫助用戶更有效地管理和監(jiān)控MySQL 服務(wù)器的工具,有些是開源的,也有些是商業(yè)的。

  附錄A 介紹了近年來成長迅速的三個主要的非MySQL 官方版本,其中一個是我們公司在維護(hù)的產(chǎn)品。知道還有其他什么是可用的選擇是有價值的;很多MySQL 難以解決的棘手問題在其他的變種版本中說不定就不是問題了。這三個版本中的兩個(Percona Server 和MariaDB)是MySQL 的完全可替換版本,所以嘗試使用的成本相對來說是很低的。當(dāng)然,在這里我們也需要補(bǔ)充一點,Oracle 提供的MySQL 官方版本對于大多數(shù)用戶來說都能服務(wù)得很好。

  附錄B 演示了如何檢查MySQL 服務(wù)器。知道如何從服務(wù)器獲取狀態(tài)信息是非常重要的;而了解這些狀態(tài)代表的意義則更加重要。這里將覆蓋SHOW INNODB STATUS 的輸出結(jié)果,因此這里包含了InnoDB 事務(wù)存儲引擎的深入信息。在這個附錄中討論了很多InnoDB的內(nèi)部信息。

  附錄C 演示了如何高效地將大文件從一個地方復(fù)制到另外一個地方。如果要管理大量的數(shù)據(jù),這種操作是經(jīng)常都會碰到的。附錄D 演示了如何真正地使用并理解EXPLAIN 命令。附錄E 演示了如何破除不同查詢所請求的鎖互相干擾的問題。最后,附錄F 介紹了Sphinx,一個基于MySQL 的高性能的全文索引系統(tǒng)。


點此購買
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號