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