mysql資料庫sql優化

2021-07-25 17:13:42 字數 2765 閱讀 3416

sql優化

本文件描述了mysql資料庫的sql優化,從整體上描述mysql資料庫的sql執行過程,及整個流程上相關優化點,重點描述innodb儲存引擎的索引優化及鎖機制,旨在為讀者提供在mysql上做sql優化的思路,達到授人以漁的效果,希望能為讀者帶來收穫。

效能:完成某項任務所需要的時間度量,即響應時間

效能優化:就是降低任務執行的響應時間

無法測量就無法有效的優化

一、perconatoolkit中的pt-query-digest

二、new relic

mysql的效能剖析分為執行效能分析與等待效能分析

一、剖析mysql查詢

1、剖析伺服器負載:

a、慢查詢日誌:5.1版本之後,慢查詢精度公升級到微秒級,而且可以輸出所有的查詢,且對效能的影響微乎其微。

b、pt-query-digest:慢查詢日誌分析工具

2、 剖析單挑查詢效能:

a、show profile:記錄每個查詢的耗時,及每個步驟的耗時。

b、show status:統計伺服器級別、回話級別的計數器,如:控制代碼計數器、臨時檔案計數器、表計數器等

c、慢查詢:

d、performance schema

e、explain

1、資料型別:

a、更小的通常更好:占用更少的磁碟、記憶體、cpu快取、cpu週期

b、簡單就好:簡單的資料型別操作使用更少的cpu週期。如:整型比字串操作的代價更低

c、標誌位型別選擇:能滿足需求的整型是最好的選擇,因為整型很快,可以自增長;對於完全隨機的字串(md5/uuid等)非常不適合做標誌列,因為耗費很多空間,插入會隨機寫入索引的不同位置,會導致索引**、磁碟隨機訪問,select也會變得更慢,因為本來邏輯相鄰的行被分散在磁碟和記憶體的不同位置,隨機值會導致快取快取效果很差。

d、快取表和彙總表以及計數器表

一、優化資料訪問

1、應用程式是否檢索了太多的無用的行和列

a、查詢不需要的行,然後丟棄

b、多表關聯返回所有的列

c、總是去除全部列:select *

2、mysql伺服器是否在分析大量超過需要的資料行

a、看mysql查詢是返回的行數是否與mysql伺服器掃瞄的行數相差太大

b、掃瞄的行數與訪問型別:返回一行資料的訪問型別不同成本也會不同,訪問型別從慢到快(掃瞄的行數從多到少)為:全表掃瞄、範圍掃瞄、唯一索引掃瞄、常數引用

c、mysql在如下三種方式中使用where條件(由好到壞):

1、在索引中使用where條件過濾掉不匹配的記錄,在儲存引擎層實現

2、使用索引覆蓋掃瞄來返回記錄,直接從索引中過濾掉不需要的記錄並返回命中結果,在mysql伺服器層實現

3、從資料表中返回資料,然後過濾掉不滿足條件的記錄,在mysql伺服器層完成

3、重構查詢

a、乙個複雜查詢拆分成多個簡單查詢

b、切分查詢

c、分解關聯查詢:快取效率更高、單條查詢可以減少鎖的競爭、更容易做資料庫拆分、單條查詢本身的效率更高、減少冗餘記錄的查詢

一、主流程圖

二、優化點

1、客戶端與服務端通訊

a、客戶端與服務端採用半雙工的通訊協議,所以當客戶端傳送請求或者服務端返回結果後都不能被中止,所以為了安全起見,服務端接受客戶端請求資料報有長度限制(可配置max_allowed_packet引數),對於返回的結果伺服器沒有長度限制,但是對於大資料的查詢應都是用limit限制返回的結果集,否則很容易導致客戶端程式記憶體溢位。

b、連線狀態:sleep、query、locked、analyzing andstatistics、coping to tmptable、sortingresult、sending data

2、查詢快取

a、開啟快取功能功能:query_cache_type = off |on | demand

c、mysql使用乙個對映表快取查詢結果,查詢key大小寫敏感

d、查詢快取有乙個個資料塊組成,每個資料塊變長,儲存了該資料塊型別、大小、儲存的資料、指向前乙個資料塊的指標、指向下乙個資料塊的指標,所以查詢快取是乙個雙向鍊錶結構

e、資料塊的型別:儲存查詢結果、儲存查詢與資料表的對映、儲存查詢文字等

f、伺服器啟動的時候會初始化一塊完整的記憶體,其中可用的空閒塊為初始值減去維護元資料所需要的空間(約40kb)

g、查詢一開始返回結果的時候就快取資料,而這個時候根本不知道快取結果的精確大小,所以也無法準確的給查詢結果分配空間。所以需要先從乙個大的空間塊中申請乙個資料塊(大於query_cache_min_res_unit的配置),當資料塊快取不下結果時會再申請乙個新的資料塊,而當結果小於資料塊時,則釋放該資料塊多餘的空間。

3、查詢優化器

mysql處理的優化型別:

a、重新定義關聯表的順序

b、將外關聯轉化成內關聯

c、使用等價變換規則

d、優化count()、min()、max()

e、預估並轉化成常數表示式

f、覆蓋索引掃瞄

g、提前終止查詢

h、等值傳播

k、列表in()的比較

4、排序優化

1、首選使用索引生成排序結果,如果沒有索引利用,mysql需要自己生成排序結果,如果排序的資料小於「排序緩衝區(max_length_for_sort_data)」,則直接在緩衝區排序,否則會將資料分塊在緩衝區排序,將拍需要的結果存入磁碟,然後在將各個排序好的分塊合併起來。

5、查詢執行引擎

MySQL資料庫SQL優化(原則)

通過web應用關係圖譜可以看出web應用的響應速度取決於多個方面 優化方法 1 改變 sql 執行計畫 明確了優化目標之後,我們需要確定達到我們目標的方法。對於 sql 語句來說,達到上述2個目標的方法其實只有乙個,那就是改變 sql 的執行計畫,讓他盡量 少走彎路 盡量通過各種 捷徑 來找到我們需...

mysql資料庫sql語句優化

昨天幫同事優化了乙個sql語句發出來共勉下 select t.select s.codename from sys codelist s where s.codevalue t.packagingtype and s.kindcode packaging as packagingtypename,s...

MySQL 資料庫效能優化之SQL優化

hosted on dreamhost 可以通過我的折扣碼imysqler獲得優惠折扣 有人反饋之前幾篇文章過於理論缺少實際操作細節,這篇文章就多一些可操作性的內容吧。盡量避免 select 很多人看到這一點後覺得比較難理解,上面不是在誤區中剛剛說 select 子句中字段的多少並不會影響到讀取的資...