原创 MySQL 查詢優化(七): COUNT優化技巧

優化COUNT函數的查詢在 MySQL 中最容易被誤解的話題中能夠排進前10名,我們可以在網上搜索去了解更多過於 COUNT 優化的誤解信息。在進行優化前,理解 COUNT 到底做了什麼很重要。 COUNT 函數做什麼用? COUNT

原创 MySQL 查詢優化(六): MySQL 的查詢優化排序優化機制

對結果進行排序操作的代價可能很高,因此可以通過避免排序或讓參與排序的數據行更少來優化查詢性能。 當 MySQL 不能使用索引產生有序結果時,它必須對數據行進行排序。這有可能是在內存中進行也可能是在磁盤進行,但 MySQL 始終將這個過程稱之

原创 MySQL 查詢優化(五):一文看懂聯合查詢優化機制

MySQL 使用聯合的形式的地方會遠遠超過我們過去認知的範疇。基本上,它會認爲每個查詢都有聯合,而不僅僅是從兩張表中查出匹配的數據行,這包括了子查詢,甚至僅僅對單表的 SELECT 操作。因此,理解 MySQL 如何執行聯合十分重要。

原创 MySQL 查詢優化(四):深入瞭解 MySQL查詢優化處理(1)

MySQL查詢優化需要經過解析、預處理和優化三個步驟。在這些過程中,都有可能發生錯誤。本篇文章不會深入討論錯誤處理,而是幫助理解 MySQL 執行查詢的方式,以便可以寫出更好的查詢語句。 解析器和預處理器 一開始,MySQL 的解析器將查詢

原创 MySQL查詢優化(三):深度解讀 MySQL客戶端和服務端協議

如果需要從 MySQL 服務端獲得很高的性能,最佳的方式就是花時間研究 MySQL 優化和執行查詢的機制。一旦理解了這些,大部分的查詢優化是有據可循的,從而使得整個查詢優化的過程更有邏輯性。下圖展示了 MySQL 執行查詢的過程: 客戶端

原创 高性能索引優化策略(六):通過案例快速瞭解如何構建索引

理解索引概念最簡單的方式是通過一個案例來進行,以下就是這樣的一個案例。 假設我們需要設計一個在線的約會網站,這個網站的用戶資料有許多列,例如國籍、省份、城市、性別、年齡、眼睛顏色等等。這個網站必須支持通過多種組合方式搜索用戶資料。同時,也需

原创 高性能索引優化策略(二):多個索引是獨立建立索引還是建聯合索引?

通常會對多列索引缺乏理解,常見的錯誤是將很多列設置獨立索引,或者是索引列使用錯誤的次序。我們在下一篇討論索引列次序的問題,首先看一下多列獨立索引的情況,以下面的表結構爲例: CREATE TABLE test ( c1 INT, c

原创 高性能索引優化策略(七):索引和數據表維護

使用合適的數據類型完成數據表創建和建立索引後,工作並沒有完結——你需要去維護數據表和索引以保證它們運行良好。數據表維護的主要目的是查找和修復衝突,維護精確的索引統計和減少碎片。 查找和修復數據表衝突 數據表最糟糕的事情就是發生衝突。使用My

原创 高性能索引優化策略(八):減少索引和數據的碎片化

二叉樹索引可能導致碎片化,進而影響數據庫性能。碎片化的索引存儲性能很弱或在磁盤上不是有序的。使用二叉樹索引去超找頁節點時本身就需要隨機的磁盤訪問,因此隨機訪問是二叉樹索引的特性,而並不是異常。然而,如果頁節點在物理上是有序的並且緊密存儲,那

原创 高性能索引優化策略(五):覆蓋索引性能很高,怎麼回事?

一個通常的建議是爲WHERE條件創建索引,但這其實是片面的。索引應當爲全部查詢設計,而不僅僅是WHERE條件。索引確實能有效地查找數據行,但MySQL也能夠使用索引獲取列數據,這樣根本不需要去讀取一行數據。畢竟,索引的葉子節點包含了索引對應

原创 MySQL查詢優化(二):重寫查詢語句的三種策略

在優化存在問題的查詢時,我們需要改變方式去獲取查詢結果——但這並不意味着從 MySQL獲取同樣的結果集。有些時候我們可以將查詢轉換爲獲取相同結果,但更好性能的查詢形式。然而,我們也需要考慮重寫查詢去獲取不同的結果,因爲這樣可以提高開發效率。

原创 MySQL查詢優化(一):如何分析查詢性能?

查詢優化、索引優化和表設計優化是環環相扣的。如果你有豐富的編寫MySQL查詢語句的經驗,你就會知道如何設計表和索引來支持有效的查詢。同樣的,知曉表設計同樣有助於瞭解表結構如何對查詢語句產生影響。因此,即便表設計和索引都設計得很好,但如果查