粗略流程,所有關係型資料庫都是這幾步,具體前後順序根據不同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,我喜歡怎麼樣的sql?
能寫出多好的sql取決於你多了解資料庫,完
資料庫執行sql的大致流程 資料庫如何優化?
資料庫執行sql的大致流程 粗略流程,所有關係型資料庫都是這幾步,具體前後順序根據不同dbms不同配置下略有小差別,以下過程都需要耗時耗資源 1.應用程式與資料庫伺服器建立鏈結 2.sql傳送到資料庫,資料庫驗證是否有執行的許可權 3.進入語法解析器,進行詞法與語法分析 4.進入優化器生成執行計畫,...
資料庫監測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追蹤資料庫死鎖 ...