MySQL DML執行流程揭秘 查詢語句執行流程

2021-10-16 17:28:04 字數 3568 閱讀 1853

查詢中join

group by的優化

order by工作原理

count(id) count(*) count(cel)你真的懂嗎

問題分析總結

一 條s

ql查詢

語句怎麼

執行的\color

一條sql查

詢語句怎

麼執行的

儲存引擎

select city,name,age,

from student where city =

'北京'

order

by name limit

100;

其中有id主鍵,city是乙個b+tree索引語句中有排序需求,第一步初始化sort_buffer,確認放入name,city,age三個字段

從索引city中找到第乙個滿足city='北京'條件的主鍵id

到主鍵id索引取出整行資料,取出name,city,age放在sort_buffer從索引city中取出下一條滿足條件的主鍵id

重複步驟3-4直到不滿足查詢條件為止

對sort_buffer中資料按照name欄位進行快速排序按照排序結果取出前100行資料返回給客戶端

其中按照name做排序可以在記憶體中完成,如果sort_buffer_size設定值較小,則會使用磁碟臨時檔案進行輔助排序

-- 以下方法可確定是否使用了臨時檔案

/* 開啟optimizer_trace,只對本執行緒有效 */

set optimizer_trace=

'enabled=on'

;/* @a儲存innodbrowsread的初始值 */

select variable_value into @a from performance_schema.session_status where variable_name =

'innodb_rows_read'

;/* 執行語句 */

select city, name,age from t where city=

'杭州' order by name limit 1000;

/* 檢視 optimizer_trace 輸出 */

select * from information_schema.optimizer_trace\g

/* @b儲存innodb_rows_read的當前值 */

select variable_value into @b from performance_schema.session_status where variable_name =

'innodb_rows_read'

;/* 計算innodb_rows_read差值 */

select @b-@a;

-- 結果

number_of_tmp_files 表示使用了多少個臨時檔案, 如果為0表示沒有使用臨時檔案

examined_rows: 表示參與排序的行數

sort_mode:

開啟優化器的執行跟蹤

/* 開啟 optimizer_trace,只對本執行緒有效 */

set optimizer_trace=

'enabled=on'

;/* 執行語句 */

select word from words order by rand(

) limit 3;

/* 檢視 optimizer_trace 輸出 */

select * from information_schema.optimizer_trace\g

mysql處理查詢是「邊讀邊發,查詢結果是分段傳送給客戶端的」join優化器是比較合適的驅動表,straight_join則是讓優化器按照我們的指定方法去join

select

*from t1 straight_join t2 on

(t1.a = t2.a)

從表t1中讀取一行資料

從資料中,取出a欄位到表t2裡去查詢,會使用到t2表的a欄位對應的索引

取出表t2中滿足條件的行,和之前的資料合併成一行,最為結果集的一部分

重複步驟1-3,直到把錶t1的末尾迴圈結束

join_buffer的作用:表關聯查詢的時候,執行計畫中有時會看到 join buffer, 表示會把分段讀取的驅動表資料放在join_buffer中,然後根據join條件關聯下張被驅動表作為結果集的一部分返回。由引數join_buffer_size 設定,預設: 256k使用join語句,比直接強行拆成多個單標執行sql語句的效能要好

如果使用join語句的話, 需要讓小表做驅動表,當然被驅動表需要能走索引

如果使用index nested-loop join演算法, 也就是可以用上被驅動表上的索引, 則join沒有問題

如果使用 block nested-loop join (bnl)演算法, 掃瞄行數過多, 特別是大表上的join操作,這樣可能要掃瞄的被驅動表多次,會占用大量的系統資源。主要關注 執行計畫中是否有 「block nested loop」字樣

資料庫設計法則

在保證邏輯正確前提下,儘量減少掃瞄的數量,減少磁碟的io,對於ionodb來說,主鍵索引儲存的是資料,對於count(*)這種操作,優化器會找到最小的那棵樹遍歷,因為遍歷那棵樹得到的邏輯結果一致。

count()含義

count()是乙個聚合函式, 對於返回的結果集,逐行進行判斷,count中引數不是null, 則累加1, 否則不加。最後返回累加值,

count(*), count(1), count(主鍵id) 都表示返回滿足條件的結果集總行數; 而count(其他字段) 則表示返回滿足提交的資料行裡面 引數不為null的數量

效能上的差別

總結:按照效率排序:count(字段)select

*from student where id =

1這種情況可能是表被鎖,我們可以使用show processlist檢視當前sql語句執行的情況

三種可能性:等待mdl鎖等待flush等待行鎖

Yii YII執行流程

yii整體執行流程直觀,具體由以下步驟 1 程式入口檔案index.php載入yii框架引導程式 bootstrap 檔案yii.php,載入配置檔案以及其他自定義配置。2 yii.php中yii類繼承了yiibase,主要封裝框架的一些通用方法,比如自動載入 建立元件 核心類路徑對映 記錄日誌以及...

MapReduce執行流程

mapreduce的大體流程是這樣的,如圖所示 由可以看到mapreduce執行下來主要包含這樣幾個步驟 1.首先對輸入資料來源進行切片 2.master排程worker執行map任務 3.worker讀取輸入源片段 4.worker執行map任務,將任務輸出儲存在本地 5.master排程work...

iOS執行流程

3 開啟乙個訊息迴圈 5 載入info.plist檔案,讀取最主要storyboard檔案的名稱 6 載入最主要的storyboard檔案,建立白色箭頭所指的控制器物件 7 並且設定第6步建立的控制器為uiwindow的rootviewcontroller屬性 根控制器 8 展示uiwindow,展...