首先聲明一下,sql會用略懂,不是專家,如下內容均爲工做經驗,聊以抒情。html
今天幫忙驗證同事發佈的端口時,查看了一下相關sql內容,發現其使用的sql語句會致使笛卡爾積現象,爲了幫其講解進行了以下分析:sql
student表:性能
teacher表:spa
course表:3d
student_course表:code
與發現問題相似的SQL1查詢語句:htm
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語句:blog
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 = '英語';
執行時間對比(已經屢次驗證):get
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
分析緣由:class
在不加course.cu_name = '英語'這條約束條件時,咱們對比一下查詢結果內容,以下所示SQL1查詢結果:
SQL2查詢結果:
能夠看出SQL1結果的字段多於SQL2,當數據量很大或相關表字段更多時,經過where的條件查詢會在性能上有明顯的區別,所以建議sql編寫時注意相關方法的使用以提高性能。
只是個小實驗,詳細解釋可參考該貼:http://www.javashuo.com/article/p-vqatckcj-gg.html
盜圖一枚,敬請見諒。