《高效能MySQL》之MySQL查詢效能優化

2022-02-02 13:53:15 字數 1527 閱讀 8906

響應時間過長。如果把查詢看做是乙個任務,那麼它由一系列子任務組成,每個子任務都會消耗一定的時間。如果要優化查詢,實際上優化其子任務,要麼消除其中一些子任務,要麼減少子任務的執行次數,要麼讓子任務執行得更快。

查詢的生命週期:

客戶端->伺服器->伺服器上解析->生成執行計畫->執行->返回結果給客戶端。

其中」執行」包括大量為了檢索資料到儲存引擎的呼叫以及呼叫後的資料處理,包括排序、分組等。

查詢效能低下最基本的原因:訪問的資料太多。

低效查詢分析:

1.確認應用程式是否在檢索大量超過需要的資料;

2.確認mysql伺服器層是否在分析大量超過需要的資料行;

典型案例(主要體現為了省事,使用select *):

在確定查詢只返回需要的資料以後,接下來看查詢為了返回結果是否掃瞄過多的資料。對於mysql,最簡單的衡量查詢開銷的三個指標:

響應時間

響應時間包含服務時間和排隊時間。

服務時間是指資料庫處理這個查詢真正花了多長時間。

排隊時間是指伺服器因為等待某些資源而沒有真正執行查詢的時間,可能等i/o操作完成,也可能等待行鎖。

掃瞄的行數和返回的列數

在一定程度上能夠說明該查詢找出需要的資料的效率高不高。

理想情況下掃瞄行數和返回的行數應該是相同的。

掃瞄的行數和訪問型別

訪問型別主要指全表掃瞄、索引掃瞄、範圍掃瞄、唯一索引查詢、常數引用。

一般mysql能夠使用如下三種方式應用where條件,從好到壞依次為:

如果發現查詢需要掃瞄大量的資料但只返回少數的行,那麼通常可以嘗試下面的技巧去優化它:

複雜查詢拆分多個簡單查詢

切分查詢

將大查詢拆分為小查詢,每個查詢功能完全一樣,只完成一小部分,每次只返回一小部分查詢結果。

分解關聯查詢

用分解關聯查詢的方式重構查詢有如下優勢:

2.伺服器先檢查查詢快取,如果命中快取,則立刻返回儲存在快取中的結果。否則進入下一階段。

3.伺服器端進行sql解析、預處理,再由優化器生成對應的執行計畫。

4.mysql根據優化器生成的執行計畫,呼叫儲存引擎的api來執行查詢。

5.將結果返回給客戶端。

優化count()查詢

優化關聯查詢

優化子查詢

對於子查詢的優化,盡可能使用關聯查詢代替。

優化group by 和 order by

最有效的優化辦法是使用索引。

當無法使用索引時,可以使用臨時表或者檔案排序來做分組。

另外如果需要對關聯查詢做分組,並且是按照查詢表中的某個列進行分組,那麼通常採用查詢表的標識列分組的效率會比其他列更高。

優化limit 分頁

在系統中需要進行分頁操作的時候,我們通常會使用limit 加上偏移量的辦法實現,同時加上合適的order by子句。如果有對應的索引,通常效率會不錯,否則,mysql需要做大量的檔案排序操作。

優化union查詢

靜態查詢分析

使用使用者自定義變數

那些場景不能使用使用者自定義變數:

使用者自定義變數的用法:

高效能mysql 樹 高效能mysql精要

1 explain 中 extra using index 表示覆蓋索引,sql優化中最好能使用覆蓋索引,否則 二級索引 需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一 2 where 語句中 條件等於主鍵的 在核心索引層完成,條件等於非索引的,在服務層完成 3 讀索引...

mysql高效能索引 mysql高效能索引( )

在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...

高效能MySql之併發控制

剛買了一本高效能mysql這本書,順便做個筆記記錄學習的足跡。一 共享鎖和排它鎖 mysql的鎖系統 shared lock和exclusive lock 共享鎖和排他鎖,也叫讀鎖和寫鎖,即write lock和read lock 讀鎖是共享的,或者說是相互不阻塞的 寫鎖是排他的,乙個寫鎖會阻塞其他...