1、是否存在查詢多餘資料的情況
簡單的開銷指標:
響應時間
掃瞄的行數
返回的行數
解決方案:
使用索引覆蓋掃瞄(需要的資料都來自索引)
該錶庫表結構
重構查詢方式
2、重構查詢方式
(1)切分查詢
比如使用limit、通過時間節點變化
(2)分解關聯查詢
把複雜查詢,拆分為幾個簡單查詢
3、查詢執行基礎
(1)一次查詢過程:
客戶端傳送一條查詢給伺服器
伺服器檢查查詢快取,如果命中,直接返回快取中結果
伺服器進行sql解析,預處理,由優化器來生成對應的執行計畫
mysql根據優化器的執行計畫,呼叫儲存引擎的api進行查詢
返回結果
(2)查詢優化處理
1)語法解析和預處理:對語法規則進行驗證和解析查詢,生成乙個對應的解析樹;預處理進一步檢測數的合法性
2)查詢優化器:驗證語句合法和預處理之後,將其轉換為執行計畫。mysql使用基於成本的優化器,嘗試**乙個查詢使用某種計畫的成本,然後選擇其中成本最小的一 個。但是優化器很多時候選擇的執行計畫也不是最優,可能需要自己的處理(比如force某個索引的使用)
3)mysql中關聯查詢的執行方式(笛卡爾積、需要利用臨時表)
先在乙個表中取出單條資料
然後迴圈到下乙個表中取出匹配的行
根據各個表中匹配的行,返回查詢中需要的資料
mysql的執行計畫:開始一直巢狀迴圈、回溯完成所有表的關聯。(左側深度優先的樹)
4)利用stright_join,指定執行表的順序
5)排序優化
4、mysql查詢優化器的侷限性
(1)關聯子查詢
比對下三種方式的執行計畫
前兩種沒有區別:
基於內聯的這個效率比較高,不用做
books_book
表的全表掃瞄
(2)最大值和最小值的優化
利用limit來代替min
查詢效能優化
explain
select
min(aid)
from
mobile_article_pv
where
articleid
>
3
explain
select
aid
from
mobile_article_pv
where
articleid
>
3
limit
1
因為在索引結構上,是按照順序來進行儲存的,所以可以直接用limit來獲取
《高效能MySQL》之MySQL查詢效能優化
響應時間過長。如果把查詢看做是乙個任務,那麼它由一系列子任務組成,每個子任務都會消耗一定的時間。如果要優化查詢,實際上優化其子任務,要麼消除其中一些子任務,要麼減少子任務的執行次數,要麼讓子任務執行得更快。查詢的生命週期 客戶端 伺服器 伺服器上解析 生成執行計畫 執行 返回結果給客戶端。其中 執行...
高效能MySQL之查詢效能優化(四)
本文內容基於 高效能mysql 第三版,寧海元 周振興 彭立勛 翟衛祥等譯。高效能 庫表結構優化 索引優化 查詢優化。如果要優化查詢,實際上要優化其子任務,要麼消除其中一部分子任務,要麼減少子任務的執行次數,要麼讓子任務執行得更快。通常來說,查詢的生命週期大致可以按照順序來看 從客戶端,到伺服器,然...
高效能MySQL之查詢優化
查詢執行引擎 結果返回給客戶端 mysql查詢的一些優化建議 reference 查詢優化 索引優化 庫表結構優化需要齊頭並進,乙個不落。檢視慢查詢時間 show variables like long query time 預設10s 檢視慢查詢配置情況 show status like slow...