【问题标题】:Filtering before Join or after Join in SQLSQL中Join之前或之后的过滤
【发布时间】:2012-05-27 21:18:37
【问题描述】:

我有两个查询来获取相同的数据,它们或多或少具有相同的执行时间。

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 解释显示,与后者相比,前者的行扫描次数更多。

【问题讨论】:

标签: mysql sql join explain


【解决方案1】:

MySQL 解释显示,与前者相比,前者的行扫描次数更多 后者。

好吧,你有它!除了一个小细节。与将相同条件放在 where 子句中相比,将过滤条件放在 join 语句中可能会返回不同的结果。您的两个 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 

【讨论】:

  • 从我阅读问题的方式来看,idprescription 属于prescriptionvideo,而不是chapter。而且我认为问题中的两个查询实际上都归结为同一组过滤器/条件。不过,关于性能不能说太多。
  • @AndriyM - 啊……你是对的。两个查询可能相同,但很难分辨。
【解决方案2】:

第一个更好,因为它易于读写,并且具有较低的行扫描值,否则查询具有相同的结果集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2011-09-28
    • 2016-05-10
    • 1970-01-01
    • 2015-12-08
    • 2012-06-25
    • 2017-07-06
    相关资源
    最近更新 更多