1. 程式人生 > >msyql 使用join聯合查詢與直接用where查詢的區別,比較

msyql 使用join聯合查詢與直接用where查詢的區別,比較

比如現在資料庫中有兩張表,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 的語法,因為後者會在記憶體中先生成一張資料量比較大的笛卡爾積表,增加了記憶體的開銷。