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