首先聲明一下,sql會用略懂,不是專家,以下內容均為工作經驗,聊以抒情。
今天幫忙驗證同事發布的端口時,查看了一下相關sql內容,發現其使用的sql語句會導致笛卡爾積現象,為了幫其講解進行了如下分析:
student表:

teacher表:

course表:

student_course表:

與發現問題類似的SQL1查詢語句:
SELECT d.st_name,d.class_id,d.st_id FROM course AS a, student_course AS b, teacher AS c, student AS d WHERE a.cu_id = b.cu_id AND b.st_id = d.st_id AND c.dep_id = d.dep_id AND a.cu_name = '英語';
采用內關聯的SQL2語句:
SELECT student.st_name, student.class_id, student.st_id FROM course JOIN student_course USING ( cu_id ) JOIN student USING ( st_id ) JOIN teacher USING ( dep_id ) WHERE course.cu_name = '英語';
執行時間對比(已經多次驗證):
SELECT d.st_name,d.class_id,d.st_id FROM course AS a, student_course AS b, teacher AS c, student AS d WHERE a.cu_id = b.cu_id AND b.st_id = d.st_id AND c.dep_id = d.dep_id AND a.cu_name = '英語' > OK > 時間: 0.002s SELECT student.st_name, student.class_id, student.st_id FROM course JOIN student_course USING ( cu_id ) JOIN student USING ( st_id ) JOIN teacher USING ( dep_id ) WHERE course.cu_name = '英語' > OK > 時間: 0.001s
分析原因:
在不加course.cu_name = '英語'這條約束條件時,我們對比一下查詢結果內容,如下所示SQL1查詢結果:

SQL2查詢結果:

可以看出SQL1結果的字段多於SQL2,當數據量很大或相關表字段更多時,通過where的條件查詢會在性能上有明顯的區別,因此建議sql編寫時注意相關方法的使用以提升性能。
只是個小實驗,詳細解釋可參考該貼:https://www.cnblogs.com/alianbog/p/5618349.html
盜圖一枚,敬請見諒。

