【慢SQL效能最佳化】 一條SQL的生命週期
來源:京東雲開發者
一、 一條簡單SQL在MySQL執行過程
一張簡單的圖說明下,MySQL架構有哪些元件和組建間關係,接下來給大家用SQL語句分析
例如如下SQL語句
SELECT department_id FROM employee WHERE name = 'Lucy' AND age > 18
GROUP BY department_id
其中name為索引,我們按照時間順序來分析一下
1.客戶端:如MySQL命令列工具、Navicat、DBeaver或其他應用程式傳送SQL查詢到MySQL伺服器。
2.聯結器:負責與客戶端建立連線、管理連線和維護連線。當客戶端連線到MySQL伺服器時,聯結器驗證客戶端的使用者名稱和密碼,然後分配一個執行緒來處理客戶端的請求。
解析查詢語句,檢查語法。 驗證表名和列名的正確性。 生成查詢樹。
負責實際執行索引掃描,如在employee表的name索引上進行等值查詢,因查詢全部列,涉及到回表訪問磁碟。 在訪問磁碟之前,先檢查InnoDB的緩衝池(Buffer Pool)中是否已有所需的資料頁。如果緩衝池中有符合條件的資料頁,直接使用快取的資料。如果緩衝池中沒有所需的資料頁,從磁碟載入資料頁到緩衝池中。
對於每個找到的記錄,再次判斷記錄是否滿足索引條件name。這是因為基於索引條件載入到記憶體中是資料頁,資料頁中也有可能包含不滿足索引條件的記錄,所以還要再判斷一次name條件,滿足name條件則繼續判斷age > 18過濾條件。 根據department_id對滿足條件的記錄進行分組。 執行器將處理後的結果集返回給客戶端。
二、 查詢SQL關鍵字執行順序
SELECT s.id, s.name, s.age, es.subject, es.score
FROM employee s JOIN employee_score es ON s.id = es.employee_id
WHERE s.age >18 AND es.subject_id =3 AND es.score >80;
儲存引擎首先接收來自執行器的請求。請求可能包括獲取滿足查詢條件的資料行,以及使用哪種掃描方法(如全表掃描或索引掃描)。 假設執行器已經決定使用索引掃描。在這個示例中,儲存引擎可能會先對employee表進行索引掃描(使用age索引),然後對employee_score表進行索引掃描(使用subject_id和score的聯合索引)。 儲存引擎會根據請求查詢相應的索引。在employee索引中會找到滿足age > 18條件的記錄。在employee_score索引中找到滿足subject_id = 3 AND score > 80條件的記錄。 一旦找到了滿足條件的記錄,儲存引擎需要將這些記錄所在的資料頁從磁碟載入到記憶體中。儲存引擎首先檢查緩衝池(InnoDB Buffer Pool),看這些資料頁是否已經存在於記憶體中。如果已經存在,則無需再次從磁碟載入。如果不存在,儲存引擎會將這些資料頁從磁碟載入到緩衝池中。 載入到緩衝池中的記錄可以被多個查詢共享,這有助於提高查詢效率。
在記憶體中執行連線操作,將employee表和employee_score表的資料行連線起來。 對連線後的結果集進行過濾,只保留滿足查詢條件(age > 18、subject_id = 3、score > 80)的資料行。 將過濾後的資料行作為查詢結果返回給客戶端。
前面說過,根據儲存引擎根據索引條件載入到記憶體的資料頁有多資料,可能有不滿足索引條件的資料,如果執行器不再次進行索引條件判斷, 則無法判斷哪些記錄滿足索引條件的,雖然在儲存引擎判斷過了,但是在執行器還是會有索引條件age > 18、subject_id = 3、score > 80的判斷。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027826/viewspace-2995431/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL的生命週期SQL
- 從一條巨慢SQL看基於Oracle的SQL最佳化SQLOracle
- 如何分析一條sql的效能SQL
- 第45期:一條 SQL 語句最佳化的基本思路SQL
- MySQL系列之一條更新SQL的生命歷程MySql
- Salesforce 生命週期管理(一)應用生命週期淺談Salesforce
- View生命週期與Activity生命週期的關係View
- 高手詳解SQL效能最佳化十條經驗SQL
- vue生命週期探究(一)Vue
- 生命週期
- ORACLE SQL效能最佳化系列 (一) (轉)OracleSQL
- UData查詢引擎最佳化-如何讓一條SQL效能提升數倍SQL
- 一文帶你搞懂如何最佳化慢SQLSQL
- Oracle SQL效能最佳化OracleSQL
- Oracle sql 效能最佳化OracleSQL
- Flutter 的生命週期Flutter
- Laravel的生命週期Laravel
- vue的生命週期Vue
- Fragment的生命週期Fragment
- App的生命週期APP
- View的生命週期View
- Servlet的生命週期Servlet
- bean的生命週期Bean
- Angular元件——元件生命週期(一)Angular元件
- 某條SQL突然變慢的問題分析SQL
- 《一個程式猿的生命週期》有感
- PHP 生命週期PHP
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- Fragment生命週期Fragment
- Activity生命週期
- vue - 生命週期Vue
- React生命週期React
- ubuntu生命週期Ubuntu
- React 生命週期React
- vue生命週期Vue
- 品牌生命週期和產品生命週期之間的關係
- 效能調優——SQL最佳化SQL