查詢中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,展...