資料庫執行sql的大致流程 資料庫如何優化?

2021-12-30 12:17:40 字數 2560 閱讀 6495

資料庫執行sql的大致流程

粗略流程,所有關係型資料庫都是這幾步,具體前後順序根據不同dbms不同配置下略有小差別,以下過程都需要耗時耗資源

1.應用程式與資料庫伺服器建立鏈結

2.sql傳送到資料庫,資料庫驗證是否有執行的許可權

3.進入語法解析器,進行詞法與語法分析

4.進入優化器生成執行計畫,部分dbms會檢查是否有可重用的執行計畫

5.根據執行計畫依次掃瞄相關表中的行,不在資料緩衝區的走io

6.同時對於被掃瞄的行可能加鎖,同時也可能會被其他sql阻塞

7.掃瞄的行足夠放入查詢快取則開始運算或直接返回,不夠則生成臨時表,可能消耗io

8.對sql結果進行計算(可能)

9.將計算完成的結果全部寫入網路io(可能)

10.如果事務完成則同步事務日誌並釋放鎖,具體方式取決於dbms和當前配置

11.關閉連線(可選)

如何優化

這麼多步驟,每一步都有優化策略,我盡量用簡單的語言來描述

1.應用程式與資料庫伺服器建立鏈結

引入資料庫連線池,避免每次都與資料庫建立連線,提高效率

2.sql傳送到資料庫,資料庫驗證是否有執行的許可權

沒撒好說的

3.進入語法解析器,進行詞法與語法分析

也沒撒好說的,想要資料庫在這裡少用點資源就把sql寫的簡單點,但是差別不大

4.進入優化器生成執行計畫,部分dbms會檢查是否有可重用的執行計畫

哦也,最複雜的部分來了,任何資料庫如何生成執行計畫都可以寫一本幾百頁的書,我就簡單說說,複雜的我也說不出來,哈哈哈

關係型資料庫選擇走什麼執行計畫都是基於消耗最小化的思路來的,簡單來說就是走什麼索引,按什麼順序走表,被掃到的資料行最少。如果你的表結構很複雜,有各種混搭的索引,你的join很多,那執行計畫分析的時間就會拉長。所以sql對應的表索引簡單,join或子查詢少就快,複雜了優化器也會得選擇困難症。

5.根據執行計畫依次掃瞄相關表中的行,不在資料緩衝區的走io

儲存引擎掃瞄表的效能消耗參考下面的list,消耗從大到小

全表掃全索引掃部分索引掃索引查唯一索引/主鍵查常量/null

要走索引對於sql語句也有要求,不能在謂詞上作任何運算,掃瞄行數一般不能超過表的17%左右,這對你資料分布又有要求,比如你查select *** from human where *** ='man',五五開,還是走掃瞄。這裡我就不展開了,推薦題主一本書《relational database index design and the optimizers》

6.同時對於被掃瞄的行可能加鎖,同時也可能會被其他sql阻塞

如果掃瞄的行多,sql執行的時間長,被阻塞的概率就高,阻塞別人的概率也高,然後大家一起等,資料庫就hung住了

7.掃瞄的行足夠放入查詢快取則開始運算或直接返回,不夠則生成臨時表,可能消耗io

一次取的盡量少,這不單指返回服務端的行數,應該從巢狀最深的乙個子查詢開始算

8.對sql結果進行計算(可能)

少用各種複雜的函式啊,count啊,order by啊等等

9.將計算完成的結果全部寫入網路io(可能)

請盡量少返回一點資料,如果不行請多次分批

10.如果事務完成則同步事務日誌並釋放鎖,具體方式取決於dbms和當前配置

這裡舉兩個代表性栗子:

sql渣:

for i in (1-1000):

start transaction;

insert into table values (1);

commit;

end for

sql贊:

start transaction;

for i in (1-1000):

insert into table values (1);

end for

commit;

sql讚爆:

insert into table values (1)()...........()(1000);

首先,sql語法是我臨時自創的,這個不是關鍵,關鍵在sql渣先生是1000個事務插1000行,日誌flush1000次。sql贊先生是乙個事務插1000行,事務日誌flush1次。sql讚爆最nice。

這個例子我想表達的意思是如果你要用sql做一件事,那就要盡量讓這件事占用的事務總時間最少。

第二個例子

sql渣:

update table where id > 0 and id < 1000000;

sql贊:

update table where id > 0 and id < 1000;

update table where id >= 1000 and id < 2000;

update table where id >= 2000 and id < 3000;

這個例子我想表達的意思是如果你要用sql做一件很大的事,那就盡量讓大事化成很多小事。

兩個例子好好體會下,一點不矛盾哦。補充一下,這裡每個update都是單獨事務

11.關閉連線(可選)

同1,別每次都關,關了也許還要重連。不關的話記得commit就好了,千萬要記得commit啊!

資料庫執行sql的大致流程 如何優化

粗略流程,所有關係型資料庫都是這幾步,具體前後順序根據不同dbms不同配置下略有小差別,以下過程都需要耗時耗資源 1.應用程式與資料庫伺服器建立鏈結 2.sql傳送到資料庫,資料庫驗證是否有執行的許可權 3.進入語法解析器,進行詞法與語法分析 4.進入優化器生成執行計畫,部分dbms會檢查是否有可重...

資料庫監測sql執行

sql server profiler可以檢測在資料上執行的語句,特別是有的專案不直接使用sql語句,直接使用orm框架的系統處理資料庫的專案,在除錯sql語句時,給了很大的幫助。之前寫了使用sql server profiler追蹤死鎖的文章 sql server profiler追蹤資料庫死鎖 ...

資料庫監測sql執行

sql server profiler可以檢測在資料上執行的語句,特別是有的專案不直接使用sql語句,直接使用orm框架的系統處理資料庫的專案,在除錯sql語句時,給了很大的幫助。之前寫了使用sql server profiler追蹤死鎖的文章 sql server profiler追蹤資料庫死鎖 ...