1.子查詢
1.1. MySQL從4.1版本開始支持子查詢,使用子查詢進行SELECT語句嵌套查詢,可以一次完成很多邏輯上需要多個步驟才能完成的SQL操作
1.2.子查詢雖然很靈活,但是執行效率並不高
1.3.執行子查詢時,MYSQL需要創建臨時表,查詢完畢后再刪除這些臨時表,所以,子查詢的速度會受到一定的影響,這里多了一個創建和銷毀臨時表的過程
2.連接查詢(join)
2.1.可以使用連接查詢(JOIN)代替子查詢,連接查詢不需要建立臨時表,因此其速度比子查詢快
總結:連接查詢效率高於子查詢!!!
擴展:多表聯查性能優化
優化的本質就是(join on 和where的執行順序)!!!
1.數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張 中間的臨時表,然后再將這張臨時表返回給用戶
注意:這張臨時表是數據庫(MySQL自動生成)
2.在使用left jion on時,on和where條件的區別如下:
2.1.on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄
2.2.where條件是在臨時表生成好后,再對臨時表進行過濾的條件(這時已經和left join沒關系了),條件不為真的就全部過濾掉
1
2
3.left join on + where條件查詢的索引優化實例分析:
sql:select * from A left join B on A.c = B.c where A.employee_id = 3
解讀: A表left join B表,並且指定A表中的employee_id為一個具體的值
3.1.假設A表,B表均有10000多條數據;
3.2.使用上面的sql查詢時間達到16秒(在c字段不是任何索引,用explain分析得知,AB表都使用了全表查詢,效率極低)
3.3.開始優化上面sql
(1)給AB表列c都加索引(僅用了0.1s,但是分析后顯示表A依然進行了全表掃描)
思考:為什么全表掃描的不是表B
因為Mysql內部的優化,使用小表驅動大表,它在估算到必須有一個表要全表掃描的話,一定會選擇那個數據量更小的表去全表掃描,
也就是說,在這個查詢中,因為on以后的where條件列並沒有使用到索引,所以mysql的優化只用到了表B的c索引,沒有用到表A的索引!
(2)我們有where條件查詢,不需要全表掃描,此時就需要where條件生效,操作及分析如下:
1.將A表中的索引改為employee_id+c(經驗證兩個所以都使用了,方案可行)
思考:sql執行 from中的on應該是優先於where語句的,為什么這里employee_id反而在c之前,有違常理
因為Mysql內部優化,這一句Sql在執行的時候首先是選擇了使用表B的索引來進行優化,將表A單獨放出來進行后續的操作,
然后,又發現了where語句中A.employee_id有一個聚合索引,並且employee_id處於索引頭,所以這個聚合索引是可用的,所以自然使用了此索引
2.即使把聚合索引后面的列c刪掉,與使用聚合索引的效果是一樣的,之前全表查詢,現在根據條件只查詢了滿足條件的,時間大幅縮短
擴展:mysql連接查詢中索引的重要性
1.連接查詢通過兩張表中符合連接關系的字段來建立兩張表的關聯,通常包括內連接、左外連接、右外連接和全連接
2.內連接會保留兩張表中共有的那部分記錄,因此最后產生的連接表記錄數最少;
全連接會保留兩張表中所有的記錄,因此最后產生的連接表記錄數最多;
左外連接會保留左表的全部記錄,右外連接會保留右表的全部記錄,因此最后產生的連接表記錄數處於內連接和外連接之間。
3.我們可以給關聯表的字段添加索引來減少查詢次數,提高查詢效率
4.使用多表關聯時,一般遵循以下規則:
4.1.左連接:一般給右邊表的關聯字段建立索引;
4.2.右關聯:一般給左邊表的關聯字段建立索引;
4.3.內連接:一般給關聯表的任意一邊的關聯字段建立索引即可
舉例:學生表student(id,name),課程表class(id,student_id,class),各有10000條數據
sql實例:SELECT a.id, name FROM student a
LEFT JOIN class b ON a.id = b.student_id
這個查詢的執行速度非常慢!!
1.首先用explain查看這個語句的查詢執行計划,可以看到type都為ALL,即在student表和class表中都使用的全表掃描
2.改進:試着給class表的student_id字段添加索引
alter table class add index class_index(student_id)
3.然后再次執行查詢,發現速度非常快,這就是效率改進的關鍵點所在
4.當連接查詢時產生的連接表過大時,為了防止查詢次數過多,我們要經常使用索引來減少查詢次數,提高查詢效率
————————————————
版權聲明:本文為CSDN博主「夢斷若水」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq591009234/article/details/90901869