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