查詢效能優化
基本原則:優化資料訪問
一些典型的錯誤包括:提取了超過需要的行、多表聯接時提取所有列或提取所有的列(select * 可能會造成覆蓋索引這樣的優化手段失效)
mysql中,最簡單的開銷指標包括:
1.執行時間
2.檢查的行數
3.返回的行數
---通過使用索引,在explain時可以減少處理的行數
---使用覆蓋索引來避免訪問行
重構查詢
1,使用分治法來處理查詢,每次只執行查詢的一小部分,以減少受影響的行數
2,分解聯接,將乙個多表查詢分解成多個單個查詢,然後在應用程式端實現聯接操作。
mysql中乙個基本查詢過程包括:
1.客戶端傳送查詢到伺服器
2.檢查查詢快取
3.對查詢進行解析、預處理、優化,生成查詢計畫
4.執行器呼叫儲存引擎進行查詢
5.返回查詢結果。
mysql通訊協議
1.半雙工,伺服器不同傳送和接受。
2.當伺服器傳送響應時,客戶端必須接受完整的結果集。
3.檢視執行緒的查詢狀態:show full processlist;在command列顯示其狀態:
——休眠,等待客戶端新查詢
——查詢,正在執行查詢或往客戶端傳送資料
——鎖定
——分析統計
——等等。。。
在繁忙的伺服器上,通過檢視查詢狀態,可以比較容易的找到問題所在。
查詢快取
1.大小寫敏感的雜湊查詢。
2.在返回結果前需要檢查許可權。
查詢優化
1.mysql解析器對查詢進行解析,將查詢進行分解,構造解析樹。
2.預處理器,檢查解析樹,如檢查表和列是否存在,再檢查許可權。
3.查詢優化器:從通過1、2檢查後的解析樹中,找到最優的執行方式
——**不同計畫開銷來選擇,單位是一次對4kb大小的頁面進行的隨機讀取。
在一次select後,可以通過以下語句檢視隨機讀取的次數
mysql> show status like 'last_query_cost',開銷來自對統計值的估計,但不考慮快取因素。
4.優化並不總是準確的,因為無法對統計資料進行精確更新,並且其優化會遵循一套原則。
5.兩種優化方案:
1).靜態優化,簡單的探測解析樹,例如通過代數化法則把where子句轉換成相等的形式,靜態優化和值無關,即使用不同的引數重新執行查詢也不會改變。
2).動態優化,根據上下文而定,和很多因素有關,如where子句中的值和索引中的行數。
mysql只進行一次靜態優化,每次查詢時都會進行動態優化
6.mysql能夠處理的優化型別包括
1)對聯接中的表重新排序
2)將外聯接轉換成內聯接
3)代數等價法則,簡化並規範表示式,如移除不可能的限制或條件,例如5=5 and a>5會轉換成a>5
4)優化count()、min()、max(),例如沒有where子句的count(*)在myisam中會直接使用其保留的行數精確值,而在b樹索引中,其第一行和最後一行分別是min和max值。
5)計算和減少常量表示式
6)覆蓋索引
7)優化子查詢,將其轉換成效率更高的形式
8)早期終結,比如limit或者查詢條件是乙個不可能的條件。
9)相等傳遞,mysql能辨認乙個查詢中有兩個列相等的情況
例如:select film_id from film inner join film_actor using(film_id) where film_id >500;
因為join的film_actor和film的film_id值相等,因此,where子句可以被應用到兩個表中。
10)比較in()中的資料,對in中的資料先進行排序,再用二分法查詢某個值是否在列表中。
查詢優化(MySQL優化查詢)
關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...
mysql統計查詢優化 Mysql查詢優化
效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...
MySQL學習筆記 查詢效能優化
查詢效能低下最根本的原因就是訪問的資料太多,大部分效能低下的查詢都可以通過減少訪問的資料量進行優化。一般有效的分析步驟如下 優化有問題的查詢時,目標應該是找到乙個更優的方法獲取實際需要的資料,而不是一定總是從mysql獲取一模一樣的結果集。優點 快取效率更高。許多應用程式可以方便地快取單錶查詢對應的...