SQL 語句是怎么執(zhí)行的?
數(shù)據(jù)庫中如何執(zhí)行 SQL 語句?
下圖顯示了這一過程。請注意,不同數(shù)據(jù)庫的架構各不相同,下圖展示了一些常見的設計。
圖片
第 1 步 - 通過傳輸層協(xié)議(如 TCP)向數(shù)據(jù)庫發(fā)送 SQL 語句。
第 2 步 - 將 SQL 語句發(fā)送到命令解析器,在那里進行語法和語義分析,然后生成查詢樹。
第 3 步 - 將查詢樹發(fā)送給優(yōu)化器。優(yōu)化器會創(chuàng)建一個執(zhí)行計劃。
生成執(zhí)行計劃:解析器將語法樹交給查詢優(yōu)化器。查詢優(yōu)化器的任務是優(yōu)化 SQL 查詢的執(zhí)行方式,生成一個執(zhí)行計劃。執(zhí)行計劃決定了數(shù)據(jù)庫如何從存儲中讀取數(shù)據(jù)、如何連接不同的表、如何使用索引等。優(yōu)化器會嘗試選擇最有效的執(zhí)行路徑,可能會考慮以下因素:
- 使用索引掃描(index scan)。
- 如何連接表(如使用 nested loop join、hash join、merge join 等)。
- 選擇不同的操作順序。
成本估算:優(yōu)化器基于數(shù)據(jù)庫的統(tǒng)計信息(如表的大小、索引的選擇性等)來估算不同執(zhí)行計劃的成本,選擇最優(yōu)的方案。
第 4 步 - 將執(zhí)行計劃發(fā)送給執(zhí)行器。執(zhí)行過程中,數(shù)據(jù)庫會根據(jù)需要訪問磁盤或緩存中的數(shù)據(jù)。如果查詢需要使用索引,數(shù)據(jù)庫會通過索引訪問數(shù)據(jù);如果查詢沒有使用索引,可能會進行全表掃描。
第 5 步 - 訪問方法提供執(zhí)行所需的數(shù)據(jù)獲取邏輯,從存儲引擎獲取數(shù)據(jù)。
第 6 步 - 訪問方法決定 SQL 語句是否只讀。如果查詢是只讀的(SELECT 語句),則將其傳遞給緩沖區(qū)管理器進行進一步處理。緩沖區(qū)管理器會在緩存或數(shù)據(jù)文件中查找數(shù)據(jù)。
第 7 步 - 如果語句是 UPDATE 或 INSERT,則將其傳遞給事務管理器作進一步處理。
第 8 步 - 在事務處理期間,數(shù)據(jù)處于鎖定模式。這是由鎖管理器保證的。它還能確保事務的 ACID 屬性。