SQL笛卡爾積查詢與關聯查詢性能對比

首先聲明一下,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

盜圖一枚,敬請見諒。

相關文章
相關標籤/搜索