編輯推薦
中國數據庫界幾大勢力雲集於這本曠世奇作,沒讀過咋好意思和DBA同行打招呼
螞蟻(原支付寶)數據庫團隊資深專傢攜成長迴憶與技術曆程傾情獻上優質翻譯
《數據庫索引設計與優化》旨在——通過設計適用於現代硬件的索引,來提升關係型數據庫的性能
軟硬件發展讓數據庫性能被忽視,但數據處理量增長更快,全新索引優化設計纔能根治隨機讀速緩慢
內容簡介
《數據庫索引設計與優化》提供瞭一種簡單、高效、通用的關係型數據庫索引設計方法。作者通過係統的講解及大量的案例清晰地闡釋瞭關係型數據庫的訪問路徑選擇原理,以及錶和索引的掃描方式,詳盡地講解瞭如何快速地估算SQL運行的CPU時間及執行時間,幫助讀者從原理上理解SQL、錶及索引結構、訪問方式等對關係型數據庫造成的影響,並能夠運用量化的方法進行判斷和優化,指導關係型數據庫的索引設計。
《數據庫索引設計與優化》適用於已經具備瞭SQL這一關係型語言相關知識,希望通過理解SQL性能相關的內容,或者希望通過瞭解如何有效地設計錶和索引而從中獲益的人員。另外,《數據庫索引設計與優化》也同樣適用於希望對新硬件的引入所可能帶來的變化做齣更好判斷的資深人士。
作者簡介
塔皮奧.拉赫登邁奇(Tapio Lahdenmaki),數據庫性能顧問,教授通用索引設計課程。他在IBM公司工作瞭三十多年,是公司全球課程中有關DB2 (for z/OS)性能相關課程的主要作者。Michael Leach,關係型數據庫顧問,已從IBM公司退休,他擁有二十年的應用係統及數據庫課程的教授經驗。兩位作者的文章均被翻譯成瞭多國語言廣為傳播。他們有關索引設計的方法被成功應用於許多核心係統。
精彩書評
★這本寫作於2005年的著作,是少數能夠穿越十年仍然曆久彌新的經典著作之一。譯者曹怡倩和趙建偉是支付寶的資深數據庫專傢,也是童傢旺的得意門生,他們的經驗和理解為本書增色良多。我在學習過程中也曾經從本書的英文版中獲益……
——蓋國強(Oracle ACE總監,雲和恩墨創始人) ★在工程領域,很多數據庫工程師們都積纍瞭對於索引設計與優化的經驗,可惜很少有書籍係統地介紹這部分內容,這導緻網上存在很多錯誤的觀念。可喜的是本書詳細介紹瞭一種簡單、高效的數據庫索引設計方法,可讓讀者對數據庫的索引設計快速進階。
——薑承堯(網易杭州研究院數據庫技術組負責人)
★書中使用瞭Oracle、DB2和SQL Server 這三種數據庫的大量案例,介紹瞭它們的異同與各自的特性,絕大部分內容也同樣適閤於MySQL和PostgreSQL數據庫産品。個人認為本書可奉為寶典,是值得DBA們人人收藏的一本書,也適閤作為雲計算平颱研發自動化SQL審核與索引創建組件研發工程師的工具書。
——金官丁 ★本書原著是數據庫領域的重要理論大作,幾年前童傢旺先生就推薦過此書,在《高性能MySQL》一書中也推薦過它,據說他還要求每位徒弟都熟讀此書,可見其重要性。
——葉金榮 ★記得第1次接觸到這本書英文版是在2011年的時候,從這本書中所學到的知識對我之後的工作帶來瞭極大的幫助,使我在應用係統的索引設計及SQL調優上節省瞭大量的精力且取得瞭不錯的效果。之所以能有如此成效,完全得益於Tapio Lahdenm?ki和Michael Leach兩位作者的貢獻,是他們將寶貴的經驗與智慧與廣大讀者分享。
——現阿裏螞蟻DBA團隊資深專傢 知含 ★這本書不僅講述瞭如何建立三星索引的方法論,更重要的是給齣瞭基於硬件和軟件環境下索引設計的量化評估的方法和實踐,掌握瞭這些方法後,你將能夠提前量化業務SQL上綫運行情況,並指導後期的容量評估。這本書並沒有限定具體的商業或者開源的關係型數據庫産品,而是講述通用的理論和方法。
——現阿裏螞蟻DBA團隊資深專傢 趙建偉 ★本書的目標讀者是那些希望理解SQL性能相關內容,並希望瞭解如何有效設計錶和索引的人。通過本書,擁有多年關係型係統經驗的讀者能夠更好地判斷新硬件的引入所可能帶來的變化。
——本書英文版讀者
★本書提供瞭一種簡單高效的設計索引和錶的方法。作者通過大量的舉例及案例研究描述瞭Oracle、DB2和SQL Server優化器是如何決定以何種方式訪問數據庫的,同時還闡述瞭快速估算所選擇的訪問路徑的CPU及響應時間的方法。這使得對比不同設計方案的優劣成為瞭可能,且能幫助你在眾多方案中選齣閤適的那一個。
——本書英文版讀者
★盡管所有的書中都寫瞭如何正確編寫查詢、如何組織錶,以及應當按照什麼規則來決定將哪些列添加至索引上。但我們需要的是一本能夠突破常規的書,真正開始思考為何現今仍有這麼多人還會遇到如此多的問題。《數據庫索引設計與優化》做到瞭!
——本書英文版讀者 目錄
第1 章 概述
關於SQL 性能的另一本書
不閤適的索引
誤區和誤解
誤區1:索引層級不要超過5 層
誤區2:單錶的索引數不要超過6 個
誤區3:不應該索引不穩定的列
示例
磁盤驅動器使用率
係統化的索引設計
第2章 錶和索引結構
介紹
索引頁和錶頁
索引行
索引結構
錶行
緩衝池和磁盤I/O
從DBMS 緩衝池進行的讀取
從磁盤驅動器進行的隨機I/O
從磁盤服務器緩存進行的讀取
從磁盤驅動器進行的順序讀取
輔助式隨機讀
輔助式順序讀
同步I/O 和異步I/O
硬件特性
DBMS 特性
頁
錶聚簇
索引行
錶行
索引組織錶
頁鄰接
B 樹索引的替代品
聚簇的許多含義
第3 章 SQL 處理過程
簡介
謂詞
評注
優化器及訪問路徑
索引片及匹配列
索引過濾及過濾列
訪問路徑術語
監控優化器
幫助優化器(統計信息)
幫助優化器(FETCH 調用的次數)
何時確定訪問路徑
過濾因子
組閤謂詞的過濾因子
過濾因子對索引設計的影響
物化結果集
遊標迴顧
方式1:一次FETCH 調用物化一條記錄
方式2:提前物化
數據庫設計人員必須牢記
練習
第4 章 為SELETE 語句創建理想的索引
簡介
磁盤及CPU 時間的基礎假設
不閤適的索引
三星索引——查詢語句的理想索引
星級是如何給定的
範圍謂詞和三星索引
為查詢語句設計最佳索引的算法
候選A
候選B
現今排序速度很快——為什麼我們還需要候選B
需要為所有查詢語句都設計理想索引嗎
完全多餘的索引
近乎多餘的索引
可能多餘的索引
新增一個索引的代價
響應時間
磁盤負載
磁盤空間
一些建議
練習
第5 章 前瞻性的索引設計
發現不閤適的索引
基本問題法(BQ)
注意
快速上限估算法(QUBE)
服務時間
排隊時間
基本概念:訪問
計算訪問次數
FETCH 處理
主要訪問路徑的QUBE 示例
使用滿足需求的成本最低的索引還是所能達到的最優索引:示例1
該事務的基本問題
對該事務上限的快速估算
使用滿足需求的成本最低的索引還是所能達到的最優索引
該事務的最佳索引
半寬索引(最大化索引過濾)
寬索引(隻需訪問索引)
使用滿足需求的成本最低的索引還是所能達到的最優索引:示例2
範圍事務的BQ 及QUBE
該事務的最佳索引
半寬索引(最大化索引過濾)
寬索引(隻需訪問索引)
何時使用QUBE
第6 章 影響索引設計過程的因素
I/O 時間估算的驗證
多個窄索引片
簡單就是美(和安全)
睏難謂詞
LIKE 謂詞
OR 操作符和布爾謂詞
IN 謂詞
過濾因子隱患
過濾因子隱患的例子
最佳索引
半寬索引(最大化索引過濾)
寬索引(隻需訪問索引)
總結
練習
第7 章 被動式索引設計
簡介
EXPLAIN 描述瞭所選擇的訪問路徑
全錶掃描或全索引掃描
對結果集排序
成本估算
數據庫管理係統特定的EXPLAIN 選項及限製
監視揭示現實
性能監視器的演進
LRT 級彆的異常監視
程序粒度的均值是不夠的
異常報告舉例:每個尖刺一行
問題製造者和受害者
有優化空間的問題製造者和無優化空間的問題製造者
有優化空間的問題製造者
調優的潛在空間
無優化空間的問題製造者
受害者
查找慢的SQL 調用
調用級彆的異常監視
Oracle 舉例
SQL Server 舉例
結論
數據庫管理係統特定的監視問題
尖刺報告
練習
第8 章 為錶連接設計索引
簡介
兩個簡單的錶連接
例8.1:CUST 錶作為外層錶
例8.2:INVOICE 錶作為外層錶
錶訪問順序對索引設計的影響
案例研究
現有索引
理想索引
理想索引,每事務物化一屏結果集
理想索引,每事務物化一屏結果集且遇到FF 缺陷
基本連接的問題(BJQ)
結論:嵌套循環連接
預測錶的訪問順序
閤並掃描連接和哈希連接
閤並掃描連接
例8.3:閤並掃描連接
哈希連接
程序C:由優化器選擇MS/HJ(在現有索引條件下)
理想索引
嵌套循環連接VS
嵌套循環連接VS
嵌套循環連接VS.理想索引
連接兩張以上的錶
為什麼連接的性能錶現較差
模糊的索引設計
優化器可能選擇錯誤的錶訪問路徑
樂觀的錶設計
為子查詢設計索引
為UNION 語句設計索引
對於錶設計的思考
冗餘數據
無意識的錶設計
練習
第9 章 星型連接
介紹
維度錶的索引設計
錶訪問順序的影響
事實錶的索引
匯總錶
第10 章 多索引訪問
簡介
索引與
與查詢錶一同使用索引與
多索引訪問和事實數據錶
用位圖索引進行多索引訪問
索引或
索引連接
練習
第11 章 索引和索引重組
B 樹索引的物理結構
DBMS 如何查找索引行
插入一行時會發生什麼
葉子頁的分裂嚴重嗎
什麼時候應該對索引進行重組
插入模式
索引列的穩定性
長索引行
舉例:對順序敏感的批處理任務
錶亂序(存在聚簇索引)
錶亂序(沒有以CNO 開頭的聚簇索引)
存儲在葉子頁中的錶行
SQL Server
Oracle
索引重組的代價
分裂的監控
總結
第12 章 數據庫管理係統相關的索引限製
簡介
索引列的數量
索引列的總長度
變長列
單錶索引數量上限
索引大小上限
索引鎖定
索引行壓縮
數據庫管理係統索引創建舉例
第13 章 數據庫索引選項
簡介
索引行壓縮
索引鍵以外的其他索引列
唯一約束
從不同的方嚮掃描數據庫索引
索引鍵截斷
基於函數的索引
索引跳躍式掃描
塊索引
數據分區的二級索引
練習
……
第14 章 優化器不是完美的
第15 章 其他評估事項
第16 章 組織索引設計過程
參考文獻
術語錶
索引
前言/序言
關係型數據庫至今已存在瞭三十多年。在其發展早期,由於硬件資源限製及優化器成熟度的不足,性能問題非常普遍,因此性能成為瞭人們優先考慮的事項。但現在情況已經不同瞭,硬件及軟件以超齣人們想象的速度發展瞭起來,係統已經能夠自己關心自己的性能瞭,這在之前看來是不可思議的!但比這些資源增長速度更快的是隨之産生的大量信息以及這些信息所衍生齣的活動。另外,有一個重要的硬件還沒有跟上整體的發展速度:雖然磁盤已變得更大且異常廉價,但它們的訪問速度仍相對較慢。因此,許多老問題其實並沒有消失——它們隻是變換瞭形式。這其中的有些問題可能會造成巨大的影響——那些所謂的應該隻需運行不到一秒的“簡單”查詢實際卻運行瞭幾分鍾或更久,盡管所有的書中都寫瞭如何正確編寫查詢、如何組織錶,以及應當按照什麼規則來決定將哪些列添加至索引上。所以,很明顯,我們需要有一本能夠突破常規的書,真正開始思考為何現今仍有這麼多人還會遇到如此多的問題。
為瞭滿足這一需求,我們認為必須關注兩個問題。第一個必須關注的對象是關係型係統中用於確定如何以最高效的方式查詢所需數據的部分(我們稱其為SQL 優化器)。第二個必須關注的是索引及錶是以何種方式被掃描的。我們試著把自己放在優化器的角度思考問題,也許當我們理解為什麼可能存在問題時,我們就能夠做齣改變。幸運的是,我們需要知道的有關優化器的內容其實非常少,但非常重要。本書與其他同領域的書籍的一個很重要的區彆在於,我們不會提供大量的用於指導SQL 編寫以及錶和索引設計的規則和語法。這不是一本告訴你在各種場景下應當使用哪一個SQL WHERE語句的書,也不是一本告訴你應當使用什麼語法的書。如果我們努力遵循一大堆復雜、模糊甚至可能不完整的指導原則,那麼我們就是在走前人走過的老路。相反,如果我們能夠理解SQL 請求對關係型係統造成的潛在影響,並知道如何控製這一影響,那麼我們就能夠理解、控製、最小化甚至避免這些問題。
本書的第二個目的是展示如何使用這些知識從CPU 和執行時間的角度量化運行過程。隻有這樣,我們纔能真正判斷我們設計的錶和索引是否閤適,我們需要用真實的數字來展示優化器是如何思考的、掃描將耗費多少時間,以及需要進行哪些改動以提供滿意的性能。不過,最重要的是,我們必須能夠方便且快速地完成這一評估過程,這就要求我們必須將關注點放在少數幾個真正重要的問題上,而不是將關注點放在那些不那麼重要的細節上(許多人都被這些細節問題睏擾過)。所以,關鍵就是要關注少數核心領域,並能夠說齣這需要花費多少時間或成本。
同樣是由於我們專注於核心問題,所以我們還能提供另一個優勢。對於那些可能使用多個關係型産品(即便來自相同的供應商)的人,由於我們在本書中所使用的是一種適用於所有關係型産品的通用方法,所以使用者就不需要閱讀和掌握多套截然不同的規則和建議。所有“真正的”關係型係統的優化器都有一個相同的任務:它們都必須要掃描索引和錶。它們都使用異常相似的方式來處理這些操作(雖然他們對其有各自不同的描述方式)。當然,它們之間的確存在著一些差異,但是我們可以毫不費力地處理這些不同。
也正是由於相同的原因,本書的讀者對象包括:認為瞭解SQL 性能方麵的知識或如何有效設計索引的知識能給自己帶來益處的人,直接負責索引設計的人,編寫SQL 語句用於查詢或作為應用程序一部分的人,以及那些負責維護關係型數據和關係型環境的人。隻要你覺得需要對自己所做的事情的性能影響負責,那麼你都將不同程度地從本書中受益。
最後,用一句話概括本書目標讀者所需具備的背景知識:我們假定讀者已經具備瞭SQL 這一關係型語言相關的知識。考慮閱讀本書的人應該已經具備瞭對計算機係統的大體理解。除此以外,能幫到讀者的最重要的品質也許就是對事物運行原理的好奇和興趣瞭,還有想把事情做得更好的渴望。另一方麵,在眾多擁有幾十年的關係型係統經驗的人中,有兩類人也會從本書受益:第一類是那些根據詳細的規則手冊良好地管理瞭係統很多年的人,他們想通過理解這些規則適用的原因來使自己的工作更輕鬆一些;第二類是那些已經使用瞭本書中所描述的技術很多年,但對於新硬件所帶來的改善並不贊賞的人。
本書中的絕大部分觀點及使用的技術都是原創的,因此很少有對外部齣版物及其他作者成果的引用。在本書的創作過程中,我們非常感謝給予瞭我們如此多幫助和鼓勵的朋友及同事們。感謝Matti Sthl 在全書撰寫過程中所給予的詳細指點及批判性但極其有用的建議。感謝Lennart Henng、Ari Hovi、Marja K?rmeniemi 和Timo Raitalaakso 的幫助和校對,也感謝Akira Shibamiya在關係型性能公式上的原創工作。另外,還要感謝許許多多的學生和數據庫顧問們,感謝他們提供的對於實際問題及其解決方案的深入見解。最後,特彆感謝Meta 和Lyn,沒有他們的鼓勵與支持,本書不可能完成,Meta 還特彆為本書設計瞭封麵,與全書的主旨非常契閤。
Tapio Lahdenm?ki(斯姆勒尼科,斯洛文尼亞)
Michael Leach(什魯斯伯裏,英格蘭)
數據庫索引設計與優化 下載 mobi epub pdf txt 電子書