有如下两条MySQL连接查询语句,结果是一样的,敢问哪种用法效率更高!

有如下两条MySQL连接查询语句,结果是完全一样的
上面一条直接在JOIN关键字后面连接表明,使用ON进行条件匹配,
下面一条在JOIN中使用SELECT查询进一步筛选需要的字段并缩小查询范围,
求问这两中写法哪种效率更高,因为数据量比较少,我测试的查询时间不稳定,互有胜负!

SELECT username AS id, zg.F_MC AS name, aq.F_MC AS company_name, enable AS status, zg.F_CRDATE AS create_at, u.last_login_at 
FROM t_users u
JOIN cszgzd zg ON zg.F_BH=u.username AND zg.F_SYZT='1'
LEFT JOIN aq_zzjg aq ON aq.F_GSBM=zg.F_SSZZJG AND aq.F_SYZT='1'
SELECT username AS id, zg.name, zg.company_name, enable AS status, zg.F_CRDATE AS create_at, u.last_login_at 
FROM t_users u
JOIN (
    SELECT zg.F_BH, zg.F_MC AS name, aq.company_name, zg.F_CRDATE 
    FROM cszgzd zg 
    LEFT JOIN (SELECT F_GSBM, F_MC as company_name FROM aq_zzjg WHERE F_SYZT='1') aq ON aq.F_GSBM=zg.F_SSZZJG
) zg ON zg.F_BH=u.username

这几个表在不同数据量的情况下,效率会不一样,比较靠谱的方式还是看执行计划,当然实践出真知,不到生产上跑一跑,也无法100%确定数据库会不会自行对sql进行优化,优化方向是否符合自己的预期

第一种效率高点。
第二种涉及到嵌套子查询。
你可以查看执行计划,分析sql.

明显第一个更好,写法也简洁,第二个并没有缩小查询范围,而且写法啰嗦

看执行计划,这两条sql肯定都是先全表扫描查询user表的,再拿着查询结果去join另外的表,第一条sql是先关联查询zg表,再以结果关联查询aq表,已经是一层一层筛选了;第二条sql第二步是查询zg表,没有where条件,肯定是全表扫描,第三步是查询aq_zzjg表,aq_zzjg表查询结果会生成临时表,第四步是拿着第二步结果和第三步的临时表进行关联查询,结果又生成临时表,第五步是第一步结果关联查询第四步的的临时表;第二条sql第二步明显又是全表扫描,剩下的也不知道索引生效没,再者子查询本身就比join性能差,优化个寂寞

你觉得时间没区别,是因为数据量太小,你每个表都插入1000000的数据量,差距肯定很大