MongoDB性能調(diào)優(yōu)實(shí)戰(zhàn)
定 價(jià):89 元
叢書名:數(shù)據(jù)庫(kù)技術(shù)叢書
- 作者:[澳]蓋伊·哈里森(Guy Harrison),[澳]邁克爾·哈里森(Michael Harrison)
- 出版時(shí)間:2022/11/1
- ISBN:9787111716167
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP311.132.3
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書分為以下幾個(gè)主要部分:第 1-3 章介紹方法和技術(shù)。在這些章節(jié)中,我們描述了一種性能調(diào)優(yōu)方法。還提供了一些關(guān)于 MongoDB 架構(gòu)和 MongoDB 提供的用于調(diào)查、監(jiān)控和診斷 MongoDB 性能的工具的背景知識(shí)。第 4 章和第 5 章介紹應(yīng)用程序和數(shù)據(jù)庫(kù)設(shè)計(jì)。第 6-10 章介紹應(yīng)用程序代碼的優(yōu)化。第 11-14 章討論MongoDB 服務(wù)器及其運(yùn)行硬件的優(yōu)化。
當(dāng)MongoDB于2009年出現(xiàn)時(shí),數(shù)據(jù)庫(kù)技術(shù)正處于十字路口。20多年來(lái),Oracle、SQL Server和MySQL等關(guān)系數(shù)據(jù)庫(kù)一直主導(dǎo)著數(shù)據(jù)庫(kù)市場(chǎng)。這些數(shù)據(jù)庫(kù)與關(guān)系數(shù)據(jù)模型、SQL語(yǔ)言和“ACID”事務(wù),一起成為改變現(xiàn)代商業(yè)應(yīng)用程序的基礎(chǔ),推動(dòng)了互聯(lián)網(wǎng)革命。但到了2005年左右,關(guān)系數(shù)據(jù)庫(kù)顯然無(wú)法滿足Web應(yīng)用程序的永遠(yuǎn)在線、全球可擴(kuò)展的新型需求。這些“Web 2.0”應(yīng)用程序需要新的數(shù)據(jù)庫(kù)管理系統(tǒng)。
到2010年,出現(xiàn)了大量非關(guān)系型“NoSQL”系統(tǒng)—Hadoop、HBase、Cassandra等。在這些非關(guān)系型“新貴”中,MongoDB幾乎是最成功的。在撰寫本文時(shí),MongoDB是排名前五的數(shù)據(jù)庫(kù)管理系統(tǒng)之一。在前五名中,只有MongoDB基于21世紀(jì)的技術(shù),其他4個(gè)(Oracle、MySQL、SQL Server和Postgres)都起源于20世紀(jì)80年代和90年代。
MongoDB的成功可以歸因于許多因素,例如,遵循面向?qū)ο蟮木幊谭妒揭约芭c現(xiàn)代DevOps實(shí)踐的兼容性。總的來(lái)說(shuō),MongoDB之所以蓬勃發(fā)展,是因?yàn)樗岄_發(fā)人員更輕松。然而,在過(guò)去幾年中,我們已經(jīng)看到MongoDB從“由開發(fā)人員為開發(fā)人員服務(wù)”的數(shù)據(jù)庫(kù)升級(jí)為支持新一代關(guān)鍵任務(wù)系統(tǒng)的平臺(tái),適用于越來(lái)越廣泛的企業(yè)。
隨著MongoDB的成熟以及在企業(yè)應(yīng)用上的擴(kuò)展,性能管理變得越來(lái)越重要。眾所周知,性能不佳的客戶應(yīng)用程序?qū)τ诋?dāng)今的在線企業(yè)來(lái)說(shuō)可能是致命的。例如,當(dāng)網(wǎng)頁(yè)的加載時(shí)間從1s增加到5s時(shí),用戶放棄瀏覽該頁(yè)面的概率會(huì)增加90%,這會(huì)直接影響在線收入。由于數(shù)據(jù)庫(kù)執(zhí)行大量的磁盤IO操作和數(shù)據(jù)處理,因此數(shù)據(jù)庫(kù)通常是導(dǎo)致性能不佳的根本原因。
此外,在云中,性能管理就是成本管理:性能不佳的數(shù)據(jù)庫(kù)會(huì)消耗不必要的CPU、內(nèi)存和IO資源,而這些資源需要支付費(fèi)用;◣滋鞎r(shí)間調(diào)優(yōu)基于MongoDB的大型云應(yīng)用程序可能會(huì)節(jié)省數(shù)十萬(wàn)美元的托管費(fèi)用。
事實(shí)上,我們甚至可以說(shuō)性能管理是出于對(duì)環(huán)境的考慮。為繁忙的數(shù)據(jù)庫(kù)服務(wù)器供電不僅耗費(fèi)金錢,還會(huì)產(chǎn)生溫室氣體。減少家庭能源消耗是一項(xiàng)社會(huì)責(zé)任,降低數(shù)據(jù)中心的能耗也同樣重要。調(diào)優(yōu)不當(dāng)?shù)腗ongoDB數(shù)據(jù)庫(kù)就像調(diào)優(yōu)不當(dāng)?shù)钠,?huì)適得其反:它可以讓你從A到B,但會(huì)花費(fèi)更多的汽油,并對(duì)環(huán)境造成更嚴(yán)重的損害。
我們?cè)噲D制作一本連貫而全面的MongoDB調(diào)優(yōu)手冊(cè),本書就是一次嘗試。為此,我們制定了以下目標(biāo):
為MongoDB性能調(diào)優(yōu)提供一種方法論,系統(tǒng)而有效地解決性能問(wèn)題。特別是,這種方法論試圖先于癥狀來(lái)定位原因。
解決MongoDB性能管理各方面的問(wèn)題,從數(shù)據(jù)庫(kù)設(shè)計(jì)到應(yīng)用程序代碼的調(diào)整,再到服務(wù)器和集群優(yōu)化。
高度關(guān)注調(diào)優(yōu)相關(guān)的基本技能。基本技能是顯著提升性能不可或缺的能力,如果不能很好地掌握,則通常會(huì)限制由應(yīng)用先進(jìn)技術(shù)而獲得的好處。
本書結(jié)構(gòu)
本書分為以下幾個(gè)主要部分:
第1~3章介紹方法和工具。在這幾章中,我們描述了一種性能調(diào)優(yōu)方法論,它為調(diào)優(yōu)MongoDB數(shù)據(jù)庫(kù)提供了最有效的手段。我們還提供了一些關(guān)于MongoDB架構(gòu)和工具的背景知識(shí),這些工具是MongoDB提供的,用于調(diào)查、監(jiān)控和診斷MongoDB的性能。
第4章和第5章介紹應(yīng)用程序和數(shù)據(jù)庫(kù)設(shè)計(jì)。在這里,我們介紹了開發(fā)高效文檔模型和為MongoDB集合建立索引的基礎(chǔ)知識(shí)。
第6~10章介紹應(yīng)用程序代碼的優(yōu)化。調(diào)整應(yīng)用程序代碼通?梢燥@著提升數(shù)據(jù)庫(kù)性能,并且這應(yīng)該在調(diào)整服務(wù)器或集群配置之前解決。我們將研究如何優(yōu)化MongoDB的f?ind()語(yǔ)句、聚合管道和數(shù)據(jù)操作語(yǔ)句。
第11~14章討論MongoDB服務(wù)器及其運(yùn)行硬件的優(yōu)化。我們將解釋如何優(yōu)化內(nèi)存以避免IO、如何優(yōu)化無(wú)法阻止的IO,以及如何配置高效的MongoDB集群。
讀者對(duì)象
本書適用于對(duì)提高M(jìn)ongoDB數(shù)據(jù)庫(kù)性能或提高依賴該數(shù)據(jù)庫(kù)的應(yīng)用程序的性能感興趣的人,包括應(yīng)用程序架構(gòu)師、開發(fā)人員和數(shù)據(jù)庫(kù)管理員。
盡管本書提出了一種連貫且符合邏輯的數(shù)據(jù)庫(kù)調(diào)優(yōu)方法,但并非本書的所有部分都對(duì)所有讀者有同樣的吸引力。例如,開發(fā)人員可能會(huì)發(fā)現(xiàn)應(yīng)用程序代碼部分比IO優(yōu)化部分對(duì)他更有幫助。同樣,無(wú)法訪問(wèn)應(yīng)用程序代碼的數(shù)據(jù)庫(kù)管理員可能會(huì)發(fā)現(xiàn)服務(wù)器優(yōu)化部分更有用。
每個(gè)讀者都可以選擇跳過(guò)自己不感興趣的內(nèi)容。然而,我們要強(qiáng)調(diào)的是,本書主張的是在緩解癥狀之前定位性能問(wèn)題的根本原因。在使用后面章節(jié)(例如第12章)中的方法時(shí),我們假設(shè)你已經(jīng)執(zhí)行了前面章節(jié)(例如第5章)中概述的處理方法。
我們希望這本書適合那些對(duì)MongoDB數(shù)據(jù)庫(kù)比較陌生的人閱讀,所以也簡(jiǎn)要地解釋了關(guān)鍵概念和MongoDB架構(gòu)。但前提是你對(duì)MongoDB和JavaScript編程語(yǔ)言有一定的了解。
腳本和示例數(shù)據(jù)
本書使用各種腳本來(lái)報(bào)告MongoDB的性能。所有這些腳本都可以在GitHub上找到,網(wǎng)址為https://github.com/gharriso/MongoDBPerformanceTuningBook。
主腳本mongoTuning.js提供從MongoDB shell會(huì)話中訪問(wèn)所有這些腳本的權(quán)限。要在MongoDB shell中使用這些腳本,只需以腳本名稱為參數(shù)發(fā)出Mongo命令并添加--shell選項(xiàng)即可,例如:
這些示例也可以在GitHub存儲(chǔ)庫(kù)中的examples文件夾下找到。這些示例使用的數(shù)據(jù)以壓縮轉(zhuǎn)儲(chǔ)文件的形式存儲(chǔ)在sampleData文件夾中。有關(guān)如何加載數(shù)據(jù)的說(shuō)明詳見同一文
件夾。
譯者序
前言
致謝
審校者簡(jiǎn)介
第一部分 方法和工具
第1章性能調(diào)優(yōu)方法 2
1.1 警示故事 2
1.2 對(duì)癥性能調(diào)優(yōu) 3
1.3 系統(tǒng)性能調(diào)優(yōu) 3
1.3.1 數(shù)據(jù)庫(kù)請(qǐng)求剖析 3
1.3.2 MongoDB數(shù)據(jù)庫(kù)的層次 4
1.4 小化應(yīng)用程序工作負(fù)載 5
1.5 減少物理IO 6
1.6 優(yōu)化磁盤IO 6
1.7 集群調(diào)優(yōu) 7
1.8 小結(jié) 7
第2章MongoDB架構(gòu)與概念 8
2.1 MongoDB文檔模型 8
2.1.1 JSON 9
2.1.2 二進(jìn)制JSON 9
2.1.3 集合 9
2.1.4 MongoDB schema 9
2.2 MongoDB協(xié)議 12
2.2.1 有線協(xié)議 12
2.2.2 MongoDB驅(qū)動(dòng)程序 12
2.3 MongoDB命令 13
2.3.1 查找命令 13
2.3.2 聚合命令 14
2.3.3 數(shù)據(jù)操作命令 15
2.4 一致性機(jī)制 15
2.4.1 讀取策略與寫入策略 15
2.4.2 事務(wù) 16
2.5 查詢優(yōu)化 16
2.6 MongoDB架構(gòu) 17
2.6.1 mongod 17
2.6.2 存儲(chǔ)引擎 17
2.6.3 副本集 18
2.6.4 分片 19
2.6.5 分片機(jī)制 19
2.6.6 集群平衡 20
2.7 小結(jié) 20
第3章行業(yè)工具 21
3.1 explain() 21
3.1.1 開始使用explain() 22
3.1.2 替代計(jì)劃 24
3.1.3 執(zhí)行統(tǒng)計(jì)信息 25
3.1.4 使用explain()來(lái)調(diào)優(yōu)查詢 26
3.1.5 可視化解釋函數(shù)的使用方法 28
3.2 查詢剖析器 29
3.2.1 system.prof?ile集合 30
3.2.2 分析剖析數(shù)據(jù) 31
3.3 使用MongoDB日志進(jìn)行調(diào)優(yōu) 33
3.4 服務(wù)器統(tǒng)計(jì)信息 35
3.5 檢查當(dāng)前操作 38
3.6 操作系統(tǒng)監(jiān)控 41
3.7 MongoDB Compass 42
3.8 小結(jié) 43
第二部分 應(yīng)用程序與數(shù)據(jù)庫(kù)設(shè)計(jì)
第4章schema建!46
4.1 指導(dǎo)原則 46
4.2 鏈接與嵌入 47
4.2.1 案例研究 47
4.2.2 獲取客戶的所有數(shù)據(jù) 50
4.2.3 獲取所有未結(jié)訂單 51
4.2.4 熱門產(chǎn)品 52
4.2.5 插入新訂單 53
4.2.6 更新產(chǎn)品 54
4.2.7 刪除客戶 54
4.2.8 案例研究總結(jié) 55
4.3 高級(jí)模式 56
4.3.1 子集化 56
4.3.2 垂直分區(qū) 58
4.3.3 屬性模式 58
4.4 小結(jié) 60
第5章索引 61
5.1 B樹索引 61
5.1.1 索引選擇性 62
5.1.2 唯一索引 63
5.1.3 索引掃描 63
5.1.4 不區(qū)分大小寫的搜索 64
5.2 復(fù)合索引 65
5.2.1 復(fù)合索引性能 66
5.2.2 復(fù)合索引鍵順序 66
5.2.3 復(fù)合索引指南 67
5.2.4 覆蓋索引 67
5.3 索引合并 68
5.4 局部索引和稀疏索引 68
5.4.1 局部索引 69
5.4.2 稀疏索引 69
5.5 使用索引進(jìn)行排序和連接 70
5.5.1 排序 70
5.5.2 連接 70
5.6 索引開銷 70
5.7 文本索引 73
5.8 地理空間索引 78
5.8.1 地理空間索引性能 81
5.8.2 地理空間索引限制 81
5.9 小結(jié) 82
第三部分 MongoDB代碼調(diào)優(yōu)
第6章查詢調(diào)優(yōu) 84
6.1 緩存結(jié)果 84
6.2 優(yōu)化網(wǎng)絡(luò)往返 86
6.2.1 投影 86
6.2.2 批處理 87
6.2.3 在代碼中避免過(guò)多的
網(wǎng)絡(luò)往返 88
6.2.4 批量插入 90
6.2.5 應(yīng)用程序架構(gòu) 90
6.3 選擇索引與選擇掃描 90
6.4 優(yōu)化排序操作 93
6.5 選擇或創(chuàng)建正確的索引 95
6.6 過(guò)濾策略 97
6.6.1 不等條件 97
6.6.2 范圍查詢 99
6.6.3 $OR或$IN操作 100
6.6.4 數(shù)組查詢 101
6.6.5 正則表達(dá)式 102
6.6.6 $exists查詢 103
6.7 優(yōu)化集合掃描 105
6.8 小結(jié) 105
第7章調(diào)優(yōu)和利用聚合管道 106
7.1 調(diào)優(yōu)聚合管道 106
7.1.1 優(yōu)化聚合排序 109
7.1.2 自動(dòng)管道優(yōu)化 111
7.2 優(yōu)化多集合連接 113
7.2.1 連接順序 115
7.2.2 優(yōu)化圖查找 116
7.3 聚合內(nèi)存利用 118
7.4 在聚合管道中排序 119
7.4.1 索引聚合排序 119
7.4.2 磁盤排序 121
7.5 優(yōu)化視圖 122
7.6 小結(jié) 126
第8章插入、更新和刪除 127
8.1 基礎(chǔ)知識(shí) 127
8.1.1 過(guò)濾器優(yōu)化 127
8.1.2 解釋數(shù)據(jù)操作語(yǔ)句 128
8.1.3 索引開銷 128
8.1.4 找到未使用的索引 129
8.1.5 寫入策略 130
8.2 插入 130
8.2.1 批處理 130
8.2.2 克隆數(shù)據(jù) 132
8.2.3 從文件加載 134
8.3 更新 134
8.3.1 動(dòng)態(tài)值批量更新 134
8.3.2 multi:true標(biāo)志 135
8.3.3 upsert 136
8.3.4 使用$merge的批量upsert 137
8.4 刪除 138
8.5 小結(jié) 138
第9章事務(wù) 139
9.1 事務(wù)理論 139
9.2 MongoDB事務(wù) 140
9.2.1 事務(wù)限制 141
9.2.2 TransientTransactionError 141
9.2.3 MongoDB驅(qū)動(dòng)程序中的事務(wù) 143
9.2.4TransientTransactionError對(duì)
性能的影響 145
9.3 事務(wù)優(yōu)化 146
9.3.1 避免事務(wù) 146
9.3.2 操作順序 148
9.3.3 對(duì)熱文檔分區(qū) 149
9.4 小結(jié) 150
第10章服務(wù)器監(jiān)控 152
10.1 主機(jī)級(jí)監(jiān)控 152
10.1.1 網(wǎng)絡(luò) 153
10.1.2 CPU 155
10.1.3 內(nèi)存 156
10.1.4 磁盤IO 156
10.2 MongoDB服務(wù)器監(jiān)控 156
10.2.1 Compass 156
10.2.2 Free Monitoring服務(wù) 157
10.2.3 Ops Manager 158
10.2.4 MongoDB Atlas 158
10.2.5 第三方監(jiān)控工具 160
10.3 小結(jié) 160
第四部分 服務(wù)器調(diào)優(yōu)
第11章內(nèi)存調(diào)優(yōu) 162
11.1 MongoDB內(nèi)存架構(gòu) 162
11.1.1 主機(jī)內(nèi)