主要內容 ● 監(jiān)控性能,找出效果不佳的查詢 ● 選取要優(yōu)化的查詢,**限度地提高收益 ● 使用EXPLAIN ANALYZE和Visual Explain等工具來分析查詢 ● 借助多種策略改進慢查詢 ● 正確使用索引和直方圖,創(chuàng)建快速的執(zhí)行計劃 ● 了解并分析鎖,從而解決爭用問題,提升系統(tǒng)吞吐量
性能不佳的查詢將影響用戶的體驗,導致業(yè)務收入下降;本書將幫助你在日常工作中更好地識別、分析和改進此類查詢。本書詳述涉及多個步驟的處理過程,包括監(jiān)控查詢執(zhí)行時間、識別需要優(yōu)化的查詢、分析當前的性能表現(xiàn)以及進行優(yōu)化等,還介紹相關的數(shù)據(jù)源和工具,幫助你更快地提交結果,降低系統(tǒng)
開銷。
《MySQL 8查詢性能優(yōu)化》描述多種可提升查詢性能的策略,講述如何使用傳統(tǒng)的EXPLAIN命令以及新的EXPLAIN ANALYZE工具來分析查詢、如何使用Visual Explain功能來獲得執(zhí)行計劃的可視化視圖、如何用直方圖獲得關于桶數(shù)據(jù)的分布信息。此外,將介紹鎖以及解決鎖問題的相關知識;討論MySQL優(yōu)化器的工作原理,包括新的哈希聯(lián)接算法,以及在必要時改變優(yōu)化器行為來縮短查詢的執(zhí)行時間。通過本書,你將掌握技術,能用合適工具提高用戶滿意度,從公司的計算資源中獲取更大價值。
MySQL性能優(yōu)化是一個非常大的主題,人們通常需要花費數(shù)年時間才能掌握。《MySQL 8查詢性能優(yōu)化》的篇幅就證明了這一點,即使只專注與查詢相關的優(yōu)化主題,篇幅顯然就不小了。一般而言,沒有什么簡單方法可以輕松地提升性能,恰恰相反,要找到相關的解決方法,你不僅需要了解MySQL內部各部分之間的關系,還需要了解相關技術棧其他部分的內容。如果你覺得單單在性能優(yōu)化方面就很難入門,那么步你就跨不過去。但是,請不要對性能優(yōu)化感到失望,與其他技巧一樣,也可以通過實踐逐步成為性能優(yōu)化高手。
撰寫《MySQL 8查詢性能優(yōu)化》的目的在于,使你能在MySQL性能優(yōu)化方面登堂入室,從而熟練掌握如何提升在MySQL實例上運行的那些查詢的性能。如前所述,這沒有什么簡單秘方,辦法就是學習并了解性能優(yōu)化過程中涉及的各個組件。這也是《MySQL 8查詢性能優(yōu)化》的主要內容,當然,我們也提供了如何找到相關信息,以及如何執(zhí)行一些常見任務的示例。另外,《MySQL 8查詢性能優(yōu)化》的內容僅限于對MySQL本身的探討,因此關于操作系統(tǒng)、文件系統(tǒng)以及硬件級別的內容,就相對有限了。
眾所周知,MySQL以對各種存儲引擎的支持而聞名。但除了對內部臨時表相關的探討外,《MySQL 8查詢性能優(yōu)化》只介紹InnoDB存儲引擎。而對于MySQL的版本,則只考慮MySQL 8。也就是說,《MySQL 8查詢性能優(yōu)化》中的大部分討論內容雖然也適用于舊版本的MySQL,但通常也只是為了說明MySQL 8中的新特性與舊版本的不同之處罷了。
《MySQL 8查詢性能優(yōu)化》面向的讀者
《MySQL 8查詢性能優(yōu)化》是為那些具有豐富的MySQL數(shù)據(jù)庫使用經(jīng)驗,并希望將知識擴展到查詢性能優(yōu)化領域的開發(fā)人員和數(shù)據(jù)庫管理員而編寫的。當然,在閱讀《MySQL 8查詢性能優(yōu)化》之前,你不需要具備性能優(yōu)化的相關經(jīng)驗。
在撰寫《MySQL 8查詢性能優(yōu)化》的過程中,作者嘗試添加了盡可能多的示例代碼及其輸出結果。當然,有些示例很短,有些則很長。但無論哪種情況,作者都希望讀者能夠跟上并重現(xiàn)這些示例的結果。同時請記住,由于實際環(huán)境的差異(當然,這種差異和索引統(tǒng)計信息一樣明確),示例結果可能會取決于在示例之前,相關的表和數(shù)據(jù)的獲取方式。換句話說,即使讀者完成了所有工作,得到的結果仍然可能與《MySQL 8查詢性能優(yōu)化》中的結果不同。尤其是涉及索引統(tǒng)計信息以及與計時等相關的數(shù)字時。
讀者可掃封底的二維碼,下載《MySQL 8查詢性能優(yōu)化》的示例代碼。
《MySQL 8查詢性能優(yōu)化》結構
《MySQL 8查詢性能優(yōu)化》分為6部分,共計27章。在撰寫《MySQL 8查詢性能優(yōu)化》時,作者試圖讓每章的內容都保持相對獨立,以便讀者將《MySQL 8查詢性能優(yōu)化》用作參考書。當然,這樣做的缺點之一是有時會重復出現(xiàn)某些內容。例如第18章介紹了鎖的理論方面的一些知識,以及如何對鎖進行監(jiān)控;而第22章則提供鎖爭用的一些示例。因此,第22章很自然會借鑒第18章中的部分信息,因此出現(xiàn)了一些內容上的重復。這是一個有意識的行為,作者希望各位讀者在閱讀《MySQL 8查詢性能優(yōu)化》的過程中可以減少翻頁的次數(shù),盡快找到所需內容。
在閱讀過程中,《MySQL 8查詢性能優(yōu)化》的6部分將引導你逐步完成性能優(yōu)化主題的相關探討。我們先從一些基本的背景知識開始,然后給出面向問題的解決方案。第Ⅰ部分將探討相關的方法論、基準以及測試數(shù)據(jù)。第Ⅱ部分重點介紹各種信息來源,如performance庫等。第Ⅲ部分介紹《MySQL 8查詢性能優(yōu)化》將用到的各種工具,如MySQL shell。第Ⅳ部分則提供后面兩部分將用到的理論知識。第Ⅴ部分側重分析查詢、事務以及鎖。第Ⅵ部分則探討如何通過配置、查詢優(yōu)化、復制以及緩存等技術來提升性能。某些情況下,有些內容的編排可能較特殊,例如,所有關于復制的內容都包含在單獨一章中(即第26章)。
第Ⅰ部分 入門
第Ⅰ部分介紹MySQL查詢性能優(yōu)化的相關概念,包括一些高級注意事項等。其中一些并非MySQL所獨有(不過也是在MySQL上下文中進行探討的)。第Ⅰ部分包含4章。
第1章MySQL性能優(yōu)化該章涵蓋MySQL性能優(yōu)化的一些高級概念,例如考慮整個堆棧和查詢生命周期的重要性等。
第2章查詢優(yōu)化方法論以有效方式解決性能問題至關重要。該章介紹有效工作的方法論,并強調積極工作的重要性。
第3章使用Sysbench進行基準測試通常,我們需要使用基準測試來檢驗更改效果。該章將簡要介紹基準測試,并專門探討Sysbench工具,也包括如何創(chuàng)建自定義基準測試等內容。
第4章 測試數(shù)據(jù)列出《MySQL 8查詢性能優(yōu)化》主要使用的一些標準測試數(shù)據(jù)庫。
第Ⅱ部分 信息來源
MySQL會通過一些信息來源提供有關性能的信息。在該部分,將介紹performance庫、sys庫、information庫以及SHOW語句。雖然在該部分中使用這些信息來源的例子相對較少,但在《MySQL 8查詢性能優(yōu)化》其他部分,則廣泛使用了這四個信息來源。如果你對這些信息來源還不太熟悉,我們強烈建議你詳細閱讀該部分中的各個章節(jié)。此外,該部分還包含慢查詢日志的相關內容。第Ⅱ部分共包含5章。
第5章performance庫顧名思義,MySQL中與性能相關的信息的主要來源是performance庫。該章介紹相關的術語、基本概念、組織方式以及配置信息。
第6章sys庫通過存儲過程和函數(shù)中的預定義視圖和工具,sys庫提供了各種報告信息。該章對sys庫各種可用的特性進行了概述。
第7章information庫如果想獲得關于MySQL和數(shù)據(jù)庫的元數(shù)據(jù)信息,就需要查看information庫。該庫還包含用于性能優(yōu)化的重要信息,例如關于索引、索引統(tǒng)計以及直方圖等信息。該章將概述sys庫中可用的視圖。
第8章SHOW 語句這是獲取信息的古老方法,可通過它獲得從執(zhí)行查詢到庫的各級別信息。該章將SHOW語句與information庫和performance庫相關聯(lián),并在某種程度上更詳細地介紹SHOW語句。而SHOW語句的某些內容,在information庫和performance庫中是沒有對應內容的。
第9章慢查詢日志查找慢查詢的傳統(tǒng)方法,就是將其記錄到慢查詢日志中。該章將介紹如何配置慢查詢日志,如何讀取日志事件,以及如何使用mysqldump這一實用工具對事件進行聚合等。
第Ⅲ部分 工具
MySQL提供一些在執(zhí)行日常任務以及特定任務時非常有用的工具。該部分涵蓋與監(jiān)控和簡單查詢執(zhí)行相關的三種工具。《MySQL 8查詢性能優(yōu)化》將Oracle專用的MySQL監(jiān)控解決方案作為監(jiān)控示例。即使你當前正在使用其他監(jiān)控解決方案,也建議你研究一下這個示例。因為這些不同的解決方案之間往往有一些重疊之處。此外,《MySQL 8查詢性能優(yōu)化》其余部分也廣泛使用了這三種工具。該部分包含3章。
第10章MySQL Enterprise Monitor監(jiān)控是保證數(shù)據(jù)庫穩(wěn)定運行且性能良好的重要內容之一。該章將介紹MySQL Enterprise Monitor(MEM),并說明如何安裝試用版本,以及如何進行導航和使用圖形化用戶界面等。
第11章MySQL WorkbenchMySQL通過MySQL Workbench為用戶提供圖形化界面。該章將介紹如何安裝和使用這一工具。在《MySQL 8查詢性能優(yōu)化》中,MySQL Workbench對創(chuàng)建查詢執(zhí)行計劃的可視化圖形(稱為Visual Explain,可視化解釋)至關重要。
第12章MySQL shellOracle為MySQL推出的工具之一就是MySQL shell。它是第二代的命令行客戶端,支持在SQL、Python以及JavaScript模式下執(zhí)行代碼。該章將使你快速了解這一工具,并介紹該工具對外部代碼模塊的支持,分析該工具的報告基礎結構,以及如何創(chuàng)建自定義模塊、報告和插件等。
第Ⅳ部分 方案考量與查詢優(yōu)化器
在該部分中,介紹內容的節(jié)奏稍有改變。重點從與方案、查詢優(yōu)化器和鎖相關的主題,逐步轉移到性能優(yōu)化的主題上。該部分包含6章。
第13章數(shù)據(jù)類型在關系數(shù)據(jù)庫中,每列都有各自的數(shù)據(jù)類型。數(shù)據(jù)類型定義了各列能夠存儲的值,兩個值進行比較時所遵循的規(guī)則,以及數(shù)據(jù)的存儲方式等。該章介紹MySQL中可用的各種數(shù)據(jù)類型,并提供應該使用何種數(shù)據(jù)類型的指導信息。
第14章索引索引用于查找數(shù)據(jù)。而良好的索引可以極大地提升查詢的性能。該章介紹索引的概念、關于索引的注意事項、索引類型以及索引的特性等。此外,介紹了InnoDB如何使用索引,以及應該使用何種索引策略等。
第15章索引統(tǒng)計信息當優(yōu)化器需要確定索引的有用程度以及與索引值上的條件相匹配的行數(shù)時,就需要關于索引中的數(shù)據(jù)的相關信息,即索引統(tǒng)計信息。該章介紹索引統(tǒng)計信息在MySQL中的工作方式,以及如何對其進行配置、監(jiān)控和更新。
第16章直方圖如果希望優(yōu)化器知道給定列中值出現(xiàn)的頻率,則需要創(chuàng)建直方圖。這是MySQL 8中新添加的特性。該章將介紹如何使用直方圖,其內部結構如何,以及如何查詢直方圖的元數(shù)據(jù)和統(tǒng)計信息等。
第17章查詢優(yōu)化器在執(zhí)行查詢時,優(yōu)化器會決定查詢的執(zhí)行方式。該章將介紹優(yōu)化器要完成的任務、使用的聯(lián)接算法、聯(lián)接優(yōu)化、優(yōu)化器相關配置以及資源組等內容。
第18章鎖原理與監(jiān)控容易給人帶來挫敗感的問題之一就是鎖爭用。該章首先說明數(shù)據(jù)庫為何需要鎖、鎖的訪問級別以及鎖的類型(粒度);然后介紹在無法獲得鎖時,如何減少鎖爭用,以及可在何處找到鎖相關的信息。
第Ⅴ部分 查詢分析
有了第Ⅳ部分的信息,現(xiàn)在就可對查詢進行分析了。這包括如何查找查詢,從而進行下一步的分析,然后使用EXPLAIN或performance庫分析等。當你有兩個或者兩個以上的查詢來爭用相同的鎖時,還需要考慮事務是如何工作的,并對鎖爭用問題進行調查。該部分包含4章。
第19章查找待優(yōu)化的查詢無論是將其作為日常運維的一部分,還是在緊急狀況下,你都需要查找那些需要分析和優(yōu)化的查詢。該章將介紹如何使用performance庫、sys庫、MySQL Workbench、監(jiān)控解決方案以及慢查詢日志等工具來查找那些值得研究的查詢。
第20章分析查詢有了候選查詢后,就需要分析為何執(zhí)行速度慢或給系統(tǒng)造成如此大的影響。這里用到的主要工具是EXPLAIN,該命令可提供有關優(yōu)化器選擇的查詢計劃的相關信息。如何使用EXPLAIN生成和理解查詢(包括示例)計劃是該章的重點。也可使用優(yōu)化器跟蹤程序來獲取有關優(yōu)化器如何選擇某一查詢的更多信息。分析查詢的另一種方法是使用performance庫和sys庫將查詢分解為較小的部分。
第21章事務InnoDB將所有執(zhí)行操作視作事務,并且事務是一個極為重要的概念。正確使用事務可以確保原子性、一致性和隔離性。但是,事務也可能導致嚴重的性能和鎖爭用問題。該章探討事務為何成為問題,以及如何分析事務。
第22章診斷鎖爭用該章介紹了四種鎖爭用的場景(刷新鎖、元數(shù)據(jù)鎖、記錄鎖以及死鎖),并探討這四種鎖的癥狀、形成原因、重建場景的方式、調查、解決方案以及預防方式等。
第Ⅵ部分 提升查詢性能
現(xiàn)在,你已經(jīng)找到有問題的查詢,并對其進行分析,包括事務情況,以了解表現(xiàn)不佳的原因。但是,你應該如何改善查詢呢?該部分介紹其他章節(jié)未涵蓋的重要配置選項,以及如何改變查詢計劃、改變方案等,同時包含批量加載、復制以及緩存等相關知識。該部分包含5章。
第23章配置MySQL在執(zhí)行查詢時需要系統(tǒng)資源。該章將介紹配置這些資源的實踐,以及其他討論中未曾介紹的一些重要配置選項。同時對InnoDB中的數(shù)據(jù)生命周期做了概述,將其作為探討InnoDB配置的背景知識。
第24章改變查詢計劃盡管優(yōu)化器通常在找到查詢執(zhí)行計劃方面表現(xiàn)不錯,但你依然需要不時為其提供幫助。例如,可能是因為沒有索引,或現(xiàn)有索引無法使用等,導致全表掃描的出現(xiàn)。你可能還想提高索引的使用率,或者可能需要重寫某個復雜條件甚至整個查詢等。該章將仔細介紹這些內容,同時說明了如何使用SKIP LOCKED子句來實現(xiàn)隊列系統(tǒng)。
第25章DDL與批量數(shù)據(jù)加載在執(zhí)行方案更改,或將大數(shù)據(jù)集加載到系統(tǒng)中時, MySQL需要完成大量工作。該章將探討如何提升這類任務的性能,包括使用MySQL shell的并行數(shù)據(jù)加載特性等。該章也包含關于數(shù)據(jù)加載注意事項的內容,這通常也適用于數(shù)據(jù)修改操作。此外,我們也顯示了順序插入和隨機插入之間的不同之處。在完成此探討后,我們就知道選擇主鍵對性能來說意味著什么。
第26章復制在實例之間進行數(shù)據(jù)復制是MySQL的一項頗為流行的特性。從性能的角度看,復制包含兩方面的內容:首先,你需要確保復制操作性能良好,此外,可通過復制來提升系統(tǒng)性能。該章探討這兩方面的內容,介紹用于監(jiān)控復制的performance庫表。
第27章緩存提升查詢性能的終極方法是根本不執(zhí)行查詢,或至少避免執(zhí)行某部分查詢。該章將探討如何使用緩存表來降低查詢的復雜性,以及如何使用Memcached、MySQL InnoDB Memcached插件和ProxySQL來避免查詢的完全執(zhí)行。
下載示例代碼和彩色圖片
《MySQL 8查詢性能優(yōu)化》正文中,有些地方會提到圖中標記、箭頭或區(qū)域的顏色!禡ySQL 8查詢性能優(yōu)化》是黑白印刷,無法顯示彩色。讀者可在實際界面中查看確切的顏色。另外,可掃描封底二維碼,下載示例代碼和彩色圖片。
自2006年以來,Jesper Wisborg Krogh先后以SQL開發(fā)人員和數(shù)據(jù)庫管理員的身份參與到MySQL數(shù)據(jù)庫工作中,并且作為MySQL技術支持團隊的一員,工作了8年之久。他曾在MySQL Connect和Oracle OpenWorld上多次發(fā)表演講。除了出版相關書籍外,他也會定期撰寫一些以MySQL為主題的博客文章,并為Oracle知識庫撰寫了約800份文檔。此外,Jesper Wisborg Krogh也為MySQL中的sys庫,以及MySQL 5.6等相關的OCP認證考試做出了許多貢獻。
在2006年轉向MySQL及軟件開發(fā)之前,Jesper Wisborg Krogh獲得計算化學的博士學位。他現(xiàn)在居住在澳大利亞的悉尼,平時喜歡在戶外散步、旅行以及閱讀等。其研究領域涉及MySQL集群、MySQL Enterprise Backup(MEB)、性能優(yōu)化,以及performance庫和sys庫等。
第Ⅰ部分 入門
第1章 MySQL性能優(yōu)化 2
1.1 通盤考慮 2
1.2 監(jiān)控 3
1.3 查詢的生命周期 4
1.4 本章小結 5
第2章 查詢優(yōu)化方法論 6
2.1 綜述 6
2.2 核實問題 7
2.3 確定原因 8
2.4 確定解決方案 8
2.5 實施解決方案 8
2.6 主動工作 10
2.7 本章小結 11
第3章 使用Sysbench進行基準測試 12
3.1 實踐 12
3.2 標準TPC基準測試 14
3.3 通用的基準測試工具 14
3.4 安裝Sysbench 15
3.5 執(zhí)行基準測試 20
3.6 創(chuàng)建自定義基準測試 25
3.6.1 自定義腳本概述 25
3.6.2 定義選項 27
3.6.3 run命令 27
3.6.4 prepare命令 29
3.6.5 cleanup命令 31
3.6.6 注冊命令 31
3.7 本章小結 32
第4章 測試數(shù)據(jù) 34
4.1 下載示例數(shù)據(jù)庫 34
4.2 world數(shù)據(jù)庫 35
4.2.1 方案 35
4.2.2 安裝 36
4.3 world_x數(shù)據(jù)庫 36
4.3.1 方案 36
4.3.2 安裝 36
4.4 sakila數(shù)據(jù)庫 37
4.4.1 方案 37
4.4.2 安裝 40
4.5 employees數(shù)據(jù)庫 41
4.5.1 方案 41
4.5.2 安裝 43
4.6 其他數(shù)據(jù)庫 44
4.7 本章小結 44
第Ⅱ部分 信息來源
第5章 performance庫 46
5.1 術語 46
5.2 線程 47
5.3 instrument 50
5.4 消費者 51
5.5 事件 53
5.5.1 事件類型 53
5.5.2 事件范圍 53
5.5.3 事件嵌套 54
5.5.4 事件屬性 55
5.6 Actor與對象 56
5.7 摘要 56
5.8 表類型 57
5.9 動態(tài)配置 58
5.10 本章小結 59
第6章 sys庫 61
6.1 sys庫配置 62
6.2 格式化函數(shù) 64
6.3 視圖 65
6.4 輔助函數(shù)與過程 66
6.5 本章小結 67
第7章 information庫 68
7.1 何為information庫 68
7.2 權限 69
7.3 視圖 69
7.3.1 系統(tǒng)信息 69
7.3.2 方案信息 70
7.3.3 性能信息 74
7.3.4 權限信息 77
7.4 索引統(tǒng)計數(shù)據(jù)緩存 78
7.5 本章小結 79
第8章 SHOW語句 80
8.1 與information庫的關系 81
8.2 與performance庫的關系 82
8.3 引擎狀態(tài) 83
8.4 復制與二進制日志 84
8.4.1 列出二進制日志 84
8.4.2 查看日志事件 84
8.4.3 顯示連接的副本 87
8.5 其他語句 88
8.6 本章小結 90
第9章 慢查詢日志 92
9.1 配置 93
9.2 日志事件 95
9.3 匯總 96
9.4 本章小結 98
第Ⅲ部分 工 具
第10章 MySQL Enterprise Monitor 100
10.1 概述 100
10.2 安裝 102
10.2.1 下載 102
10.2.2 安裝 104
10.3 啟動和停止Service Manager 109
10.3.1 在Microsoft Windows中啟動和停止Service Manager 109
10.3.2 在Linux中啟動和停止Service Manager 110
10.4 添加MySQL實例 111
10.5 圖形管理界面 113
10.5.1 通用導航 113
10.5.2 建議器 114
10.5.3 時序圖 116
10.5.4 查詢分析器 117
10.6 本章小結 118
第11章 MySQL Workbench 119
11.1 安裝 120
11.1.1 Microsoft Windows 120
11.1.2 Enterprise Linux 7 124
11.1.3 Debian和Ubuntu 127
11.2 創(chuàng)建連接 129
11.3 使用MySQL Workbench 130
11.3.1 概要 130
11.3.2 配置 131
11.3.3 安全設置 133
11.3.4 重新格式化查詢 133
11.4 EER圖 134
11.5 本章小結 135
第12章 MySQL shell 136
12.1 概要 136
12.1.1 安裝MySQL shell 137
12.1.2 調用MySQL shell 137
12.1.3 創(chuàng)建連接 137
12.1.4 語言模式 139
12.1.5 內建幫助 140
12.1.6 內建全局對象 141
12.2 提示符 141
12.2.1 內置提示符 141
12.2.2 自定義提示符 143
12.2.3 Powerline和Awesome字體 145
12.3 使用外部模塊 146
12.4 報表基礎架構 148
12.4.1 報表信息和幫助 148
12.4.2 執(zhí)行報表 149
12.4.3 添加自己的報表 151
12.5 插件 155
12.6 本章小結 161
第Ⅳ部分 方案考量與查詢優(yōu)化器
第13章 數(shù)據(jù)類型 164
13.1 為何是數(shù)據(jù)類型 164
13.1.1 數(shù)據(jù)驗證 165
13.1.2 文檔 166
13.1.3 優(yōu)化存儲 166
13.1.4 性能 167
13.1.5 正確排序 167
13.2 MySQL的數(shù)據(jù)類型 167
13.2.1 數(shù)值類型 168
13.2.2 日期和時間類型 169
13.2.3 字符串與二進制類型 169
13.2.4 JSON數(shù)據(jù)類型 171
13.2.5 空間數(shù)據(jù)類型 172
13.2.6 混合數(shù)據(jù)類型 173
13.3 性能 174
13.4 應該選擇何種數(shù)據(jù)類型 174
13.5 本章小結 176
第14章 索引 177
14.1 什么是索引 177
14.2 索引的概念 178
14.2.1 鍵與索引 178
14.2.2 索引 178
14.2.3 主鍵 179
14.2.4 二級索引 180
14.2.5 簇聚索引 180
14.2.6 覆蓋索引 180
14.3 索引的限制 181
14.4 SQL語法 181
14.4.1 創(chuàng)建帶有索引的表 182
14.4.2 添加索引 182
14.4.3 移除索引 183
14.5 索引的缺點是什么? 184
14.5.1 存儲 184
14.5.2 更新索引 185
14.5.3 優(yōu)化器 185
14.6 索引類型 186
14.6.1 B-tree索引 186
14.6.2 全文索引 188
14.6.3 空間索引 189
14.6.4 多值索引 190
14.6.5 哈希索引 193
14.7 索引的特性 195
14.7.1 函數(shù)索引 196
14.7.2 前綴索引 196
14.7.3 不可見索引 197
14.7.4 降序索引 198
14.7.5 分區(qū)與索引 198
14.7.6 自生成索引 200
14.8 InnoDB與索引 200
14.8.1 簇聚索引 201
14.8.2 二級索引 201
14.8.3 建議 201
14.8.4 用例 201
14.9 索引策略 202
14.9.1 何時添加或者移除索引? 202
14.9.2 主鍵的選擇 203
14.9.3 添加二級索引 203
14.9.4 多列索引 204
14.9.5 覆蓋索引 205
14.10 本章小結 205
第15章 索引統(tǒng)計信息 206
15.1 何為索引統(tǒng)計信息? 206
15.2 InnoDB與索引統(tǒng)計信息 207
15.2.1 統(tǒng)計信息是如何被收集的? 207
15.2.2 頁采樣 208
15.2.3 事務隔離級別 209
15.2.4 配置統(tǒng)計信息類型 209
15.3 持久索引統(tǒng)計信息 209
15.3.1 配置 210
15.3.2 索引統(tǒng)計信息表 211
15.4 臨時索引統(tǒng)計信息 214
15.5 監(jiān)控 215
15.5.1 information庫中的STATISTICS視圖 215
15.5.2 SHOW INDEX 語句 217
15.5.3 information庫中的INNODB_TABLESTATS視圖 219
15.5.4 information庫中的TABLES視圖及SHOW TABLE STATUS語句 220
15.6 更新統(tǒng)計信息 223
15.6.1 自動更新 223
15.6.2 ANALYZE TABLE語句 224
15.6.3 mysqlcheck程序 225
15.7 本章小結 227
第16章 直方圖 229
16.1 何為直方圖? 229
16.2 何時應該添加直方圖信息? 230
16.3 直方圖內部信息 231
16.3.1 bucket 231
16.3.2 累積頻率 232
16.3.3 直方圖類型 234
16.4 直方圖的添加與維護 236
16.4.1 直方圖的創(chuàng)建與更新 236
16.4.2 采樣 237
16.4.3 刪除直方圖 238
16.5 查看直方圖數(shù)據(jù) 238
16.6 直方圖報告示例 239
16.6.1 列出所有直方圖 240
16.6.2 列出一個直方圖的所有信息 240
16.6.3 列出一個單值直方圖的桶信息 241
16.6.4 列出一個等高直方圖的桶信息 243
16.7 查詢示例 244
16.8 本章小結 247
第17章 查詢優(yōu)化器 248
17.1 轉換 249
17.2 基于成本的優(yōu)化 249
17.2.1 基礎:單表SELECT操作 250
17.2.2 表聯(lián)接順序 251
17.2.3 默認過濾效果 251
17.2.4 查詢成本 252
17.3 聯(lián)接算法 254
17.3.1 嵌套循環(huán) 254
17.3.2 塊嵌套循環(huán) 257
17.3.3 哈希聯(lián)接 260
17.4 聯(lián)接優(yōu)化 263
17.4.1 索引合并 263
17.4.2 多范圍讀(MRR) 269
17.4.3 批量key訪問(BKA) 270
17.4.4 其他優(yōu)化 271
17.5 配置優(yōu)化器 274
17.5.1 引擎成本 275
17.5.2 服務器成本 275
17.5.3 優(yōu)化器開關 277
17.5.4 優(yōu)化器提示 278
17.5.5 索引提示 281
17.5.6 配置選項 282
17.6 資源組 282
17.6.1 獲取資源組相關信息 283
17.6.2 管理資源組 283
17.6.3 分配資源組 285
17.6.4 性能考量 286
17.7 本章小結 287
第18章 鎖原理與監(jiān)控 288
18.1 為何會需要鎖? 288
18.2 鎖訪問級別 289
18.3 鎖粒度 289
18.3.1 用戶級別鎖 289
18.3.2 刷新鎖 291
18.3.3 元數(shù)據(jù)鎖 292
18.3.4 顯式表鎖 295
18.3.5 隱式表鎖 295
18.3.6 記錄鎖 297
18.3.7 gap鎖、next-key鎖以及預測鎖 299
18.3.8 插入意向鎖 300
18.3.9 自增鎖 302
18.3.10 備份鎖 302
18.3.11 日志鎖 304
18.4 獲取鎖失敗 304
18.4.1 元數(shù)據(jù)鎖和備份鎖等待超時 305
18.4.2 InnoDB鎖等待超時 305
18.4.3 死鎖 306
18.5 減少鎖相關的問題 309
18.5.1 事務大小與期限 309
18.5.2 索引 309
18.5.3 記錄訪問順序 310
18.5.4 事務隔離級別 310
18.5.5 搶占鎖 312
18.6 監(jiān)控鎖 313
18.6.1 performance庫 313
18.6.2 sys庫 314
18.6.3 狀態(tài)計數(shù)器與InnoDB指標 314
18.6.4 InnoDB鎖監(jiān)控與死鎖日志 315
18.7 本章小結 318
第Ⅴ部分 查詢分析
第19章 查找待優(yōu)化的查詢 320
19.1 performance庫 321
19.1.1 語句事件表 321
19.1.2 prepared語句的匯總 325
19.1.3 表的I/O匯總 327
19.1.4 文件 I/O匯總信息 332
19.1.5 錯誤匯總表 334
19.2 sys庫 335
19.2.1 語句視圖 335
19.2.2 表I/O視圖 337
19.2.3 文件I/O視圖 338
19.2.4 語句性能分析器 340
19.3 MySQL Workbench 343
19.3.1 性能報告 344
19.3.2 客戶端連接報告 346
19.4 MySQL Enterprise Monitor 346
19.4.1 查詢分析器 346
19.4.2 時間序列圖 349
19.4.3 即席查詢報告 350
19.5 慢查詢日志 352
19.6 本章小結 352
第20章 分析查詢 354
20.1 EXPLAIN用法 355
20.1.1 顯式查詢的用法 355
20.1.2 EXPLAIN ANALYZE 355
20.1.3 連接的用法 356
20.2 EXPLAIN格式 357
20.2.1 傳統(tǒng)格式 358
20.2.2 JSON格式 359
20.2.3 樹狀格式 362
20.2.4 Visual Explain 364
20.3 EXPLAIN輸出 368
20.3.1 EXPLAIN字段 368
20.3.2 選擇類型 371
20.3.3 訪問類型 372
20.3.4 Extra信息 376
20.4 EXPLAIN示例 377
20.4.1 單表,全表掃描 378
20.4.2 單表,索引訪問 379
20.4.3 兩張表和覆蓋索引 380
20.4.4 多列索引 381
20.4.5 兩張表并帶有子查詢和排序 382
20.5 優(yōu)化器跟蹤 384
20.6 performance庫事件分析 387
20.6.1 檢查存儲過程 387
20.6.2 分析階段事件 391
20.6.3 使用sys.ps_trace_thread( )過程進行分析 393
20.6.4 使用ps_trace_statement_digest( )過程進行分析 396
20.7 本章小結 400
第21章 事務 401
21.1 事務的影響 401
21.1.1 鎖 402
21.1.2 undo日志 402
21.2 INNODB_TRX 403
21.3 InnoDB監(jiān)視器 406
21.4 INNODB_METRICS和sys.metrics 407
21.5 performance庫事務 410
21.5.1 事務事件及其語句 410
21.5.2 事務匯總表 416
21.6 本章小結 417
第22章 診斷鎖爭用 418
22.1 刷新鎖 419
22.1.1 癥狀 419
22.1.2 原因 419
22.1.3 構建 420
22.1.4 調研 420
22.1.5 解決方案 423
22.1.6 預防 423
22.2 元數(shù)據(jù)鎖和方案鎖 424
22.2.1 癥狀 424
22.2.2 原因 424
22.2.3 構建 424
22.2.4 調研 425
22.2.5 解決方案 431
22.2.6 預防 431
22.3 記錄鎖 432
22.3.1 癥狀 432
22.3.2 原因 434
22.3.3 構建 435
22.3.4 調研 435
22.3.5 解決方案 436
22.3.6 預防 437
22.4 死鎖 437
22.4.1 癥狀 437
22.4.2 原因 438
22.4.3 構建 438
22.4.4 調研 439
22.4.5 解決方案 444
22.4.6 預防 444
22.5 本章小結 445
第Ⅵ部分 提升查詢性能
第23章 配置 448
23.1 實踐 448
23.2 InnoDB綜述 451
23.3 InnoDB緩沖池 452
23.3.1 緩沖池大小 453
23.3.2 緩沖池實例 455
23.3.3 轉儲緩沖池 455
23.3.4 舊塊子列表 455
23.3.5 刷新頁 457
23.4 重做日志 458
23.4.1 日志緩沖區(qū) 459
23.4.2 日志文件 459
23.5 并行查詢執(zhí)行 461
23.6 查詢緩沖區(qū) 462
23.7 內部臨時表 463
23.8 本章小結 465
第24章 改變查詢計劃 466
24.1 測試數(shù)據(jù) 466
24.2 出現(xiàn)過多全表掃描的癥狀 467
24.3 錯誤查詢 468
24.4 未使用索引 470
24.4.1 不在多列索引的靠左位置 471
24.4.2 數(shù)據(jù)類型不匹配 473
24.4.3 函數(shù)依賴 476
24.5 改善索引的使用情況 478
24.5.1 添加覆蓋索引 479
24.5.2 錯誤索引 480
24.5.3 重寫復雜索引條件 487
24.6 重寫復雜查詢 488
24.6.1 公共表表達式(CTE) 489
24.6.2 窗口函數(shù) 493
24.6.3 使用聯(lián)接來重寫子查詢 494
24.6.4 將查詢拆分為多個部分 495
24.7 隊列系統(tǒng):SKIP LOCKED 496
24.8 多個OR或者IN條件 498
24.9 本章小結 502
第25章 DDL與批量數(shù)據(jù)加載 504
25.1 方案更改 505
25.1.1 算法 505
25.1.2 其他考量 506
25.1.3 刪除或者截斷表 506
25.2 數(shù)據(jù)加載的一般性考量 507
25.3 以主鍵順序插入 516
25.3.1 自增長主鍵 516
25.3.2 插入已有數(shù)據(jù) 517
25.3.3 UUID主鍵 518
25.4 InnoDB緩沖池與二級索引 519
25.5 配置 521
25.6 事務與加載方式 522
25.7 MySQL shell并行數(shù)據(jù)加載 522
25.8 本章小結 524
第26章 復制 526
26.1 復制概述 527
26.2 監(jiān)控 528
26.2.1 連接表 529
26.2.2 applier表 531
26.2.3 日志狀態(tài) 533
26.2.4 組復制表 534
26.3 連接 534
26.3.1 復制事件 534
26.3.2 網(wǎng)絡 535
26.3.3 維護源信息 536
26.3.4 寫入中繼日志 536
26.4 applier線程 536
26.4.1 并行applier 537
26.4.2 主鍵 538
26.4.3 放寬數(shù)據(jù)安全 538
26.4.4 復制過濾器 539
26.5 將工作負載卸載到副本 540
26.5.1 讀操作的橫向擴展 540
26.5.2 任務分離 540
26.6 本章小結 541
第27章 緩存 542
27.1 緩存,無處不在 542
27.2 MySQL中的緩存 543
27.2.1 緩存表 543
27.2.2 直方圖統(tǒng)計信息 545
27.3 Memcached 546
27.3.1 獨立服務器模式下的Memcached 547
27.3.2 MySQL InnoDB Memcached插件 549
27.4 ProxySQL 552
27.5 緩存技巧 558
27.6 本章小結 559