msyql 使用join聯合查詢與直接用where查詢的區別,比較
阿新 • • 發佈:2018-11-26
比如現在資料庫中有兩張表,student表和 student_subject表,如下所示:
我們執行以下的sql語句,只是純粹的進行表連線。
SELECT * from student JOIN student_subject;
SELECT * from student_subject JOIN student;
看一下執行結果:
表1.0 表1.1
以第一條sql語句為例我們來看一下他的執行流程,
1,from語句把student表 和 student_subject表從資料庫檔案載入到記憶體中。
2,join語句相當於對兩張表做了乘法運算,把student表中的每一行記錄按照順序和student_subject表中記錄依次匹配。
3,匹配完成後,我們得到了一張有 (student中記錄數 × student_subject表中記錄數)條的臨時表。 在記憶體中形成的臨時表如表1.0所示。我們又把記憶體中表1.0所示的表稱為‘笛卡爾積表’。
針對以上的理論,我們提出一個問題,難道表連線的時候都要先形成一張笛卡爾積表嗎,如果兩張表的資料量都比較大的話,那樣就會佔用很大的記憶體空間這顯然是不合理的。所以,我們在進行表連線查詢的時候一般都會使用JOIN xxx ON xxx的語法,ON語句的執行是在JOIN語句之前的,也就是說兩張表資料行之間進行匹配的時候,會先判斷資料行是否符合ON語句後面的條件,再決定是否JOIN。
因此,有一個顯而易見的SQL優化的方案是,當兩張表的資料量比較大,又需要連線查詢時,應該使用 FROM table1 JOIN table2 ON xxx的語法,避免使用 FROM table1,table2 WHERE xxx 的語法,因為後者會在記憶體中先生成一張資料量比較大的笛卡爾積表,增加了記憶體的開銷。