4

同じデータを取得するクエリが 2 つありますが、実行時間はほぼ同じです。

SELECT name AS prog_name,d.chap_name,d.vid_name,d.idvideo FROM program 
     JOIN (SELECT name AS chap_name,chapter.idprogram, c.vid_name,c.idvideo FROM chapter 
     JOIN (SELECT a.name AS vid_name, a.idvideo, b.idchapter FROM video a 
     JOIN (SELECT idvideo,idchapter,x.idchaptervideo FROM chaptervideo 
     JOIN (SELECT idchaptervideo FROM prescriptionvideo  WHERE idprescription=50)x 
     ON x.idchaptervideo=chaptervideo.idchaptervideo) b 
     ON b.idvideo=a.idvideo)c 
     ON c.idchapter=chapter.idchapter) d 
     ON d.idprogram=program.idprogram

SELECT program.name AS prog_name,chapter.name as chap_name,video.name as vid_name,video.idvideo FROM prescriptionvideo
JOIN chaptervideo ON prescriptionvideo.idchaptervideo=chaptervideo.idchaptervideo
JOIN video on chaptervideo.idvideo=video.idvideo
JOIN chapter on chaptervideo.idchapter=chapter.idchapter
JOIN program on chapter.idprogram=program.idprogram
where idprescription=50

どちらが優れているか誰か教えてください。前者では結合前に、後者では結合後にフィルタリングを使用しました。MySQL の説明では、後者と比較して前者の行スキャンが多いことが示されています。

4

2 に答える 2

1

MySQL の説明では、後者と比較して前者の行スキャンが多いことが示されています。

さて、それがあります!1つの小さな詳細を除いて。結合ステートメントにフィルター条件を入れると、where 句に同じ条件を入れる場合とは異なる結果が返される可能性があります。2 つの SQL クエリは、同じ結果セットを返しますが、まったく同じではありません。

SELECT program.name AS prog_name,chapter.name as chap_name,video.name as vid_name,video.idvideo FROM prescriptionvideo 
JOIN chaptervideo ON prescriptionvideo.idchaptervideo=chaptervideo.idchaptervideo 
JOIN video on chaptervideo.idvideo=video.idvideo 
JOIN chapter on chaptervideo.idchapter=chapter.idchapter and chapter.idprescription=50
JOIN program on chapter.idprogram=program.idprogram 
于 2012-05-21T11:24:28.720 に答える
0

1つ目は、読み取りと書き込みが簡単で、行スキャン値が低いため、優れています。それ以外の場合、クエリの結果セットは同じです。

于 2013-03-07T13:23:36.510 に答える