高性能MYSQL(查询优化)
查詢的生命周期:客戶端到服務(wù)端,然后服務(wù)器上進行解析,生成執(zhí)行計劃,執(zhí)行,返回結(jié)果給客戶端。
慢查詢基礎(chǔ):優(yōu)化數(shù)據(jù)訪問
1.是否想數(shù)據(jù)庫請求了不需要的數(shù)據(jù),盡量查詢需要的數(shù)據(jù),不要返回不需要的數(shù)據(jù)。
避免:查詢所有的記錄;多表關(guān)聯(lián)時返回全部的列;總是取出全部列;重復查詢相同的數(shù)據(jù)
2. Mysql是否在掃描額外的記錄
衡量查詢開銷的指標:
1)響應(yīng)時間:服務(wù)時間和排隊時間。服務(wù)時間是指數(shù)據(jù)庫處理這個查詢真正花了多長時間;排隊時間是指服務(wù)器因為等待這些資源而沒有真正執(zhí)行查詢的時間。
2)掃描的行數(shù)
3)返回的行數(shù)
當發(fā)現(xiàn)查詢需要掃描大量的數(shù)據(jù)但只返回少數(shù)的行,通常可以嘗試以下方式:
1)使用索引覆蓋掃描,把所有需要用到的列放到索引中,這樣存儲引擎無須回表獲取對應(yīng)行就可以返回結(jié)果。
**覆蓋索引:**select的數(shù)據(jù)列只用從索引中就能夠取得,不必讀取數(shù)據(jù)行,換句話說查詢列要被所建的索引覆蓋。
2)改變數(shù)據(jù)庫表結(jié)構(gòu),使用單獨的匯總表。
3)重寫這個復雜的查詢。
重構(gòu)查詢方式
Mysql客戶端/服務(wù)器通信協(xié)議
Mysql客戶端和服務(wù)端之間的通信協(xié)議是“半雙工“,要么由服務(wù)器向客戶端發(fā)送數(shù)據(jù),要么由客戶端向服務(wù)端發(fā)送數(shù)據(jù),兩則不能同時。
Mysql查詢的過程:
1.客戶端發(fā)送一條查詢給服務(wù)器;
2.服務(wù)器檢查緩存,命中緩存返回;否則進入下一階段
3.服務(wù)器進行sql解析、預處理、再由又花錢生成對應(yīng)的執(zhí)行計劃
4.mysql根據(jù)又花錢生成的張子萱計劃,調(diào)用存儲引擎的api來執(zhí)行查詢
5.返回結(jié)果
查詢狀態(tài)
使用:select full processlist 可以查詢mysql狀態(tài);
sleep;query:正在查詢或者將結(jié)果發(fā)送給客戶端; locked:現(xiàn)在正在等待表鎖;
analyzing and statistics:線程正在收集存儲引擎的統(tǒng)計信息,并生成查詢的執(zhí)行計劃; copy to tmp table;sorting result;sending data
MySql的兩種排序算法:
1.兩次傳輸排序:讀取行指針和需要排序的字段,對其進行排序,然后再根據(jù)排序結(jié)果讀取所需要的數(shù)據(jù)行。(舊)
2.單次傳輸排序:先去去查詢所需要的所有列,然后再根據(jù)給定列進行排序,最后自己返回排序結(jié)果。
具體的sql優(yōu)化:http://blog.csdn.net/qq_23211905/article/details/72259034
使用MySql構(gòu)建隊列表
1.隨著隊列表越來越大和索引深度的增加,找到未處理記錄的速度回隨之變慢。將隊列表分成兩部分,將已處理記錄歸檔或者存放到歷史表,始終保證地理很小。
2.處理步驟:1.找到未處理的記錄然后加鎖;讓現(xiàn)場一直阻塞直到滿足兩個條件中的一個:10000秒后超時;另一個線程使用kill query結(jié)束sleep。2.讓消費者標記正在處理的記錄,而不至于讓多個消費者重復處理一個記錄。
基礎(chǔ)原則:1.盡量少做事。
2.盡可能快地完成需要做的事情,盡量使用update 代替select for update 在update
總結(jié)
以上是生活随笔為你收集整理的高性能MYSQL(查询优化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java面试宝典大集锦
- 下一篇: 高性能MySQL 第3版(中文)pdf