0

0

SQL from多表和 inner join的区别

php中文网

php中文网

发布时间:2016-08-04 09:20:17

|

2751人浏览过

|

来源于php中文网

原创

这是inner join写法

SELECT
    B.dict_data_name,
    SUM(A.pv) AS pv
FROM
    shw_mo_health_news A
INNER JOIN bas_dict_data B ON A.third_name_dictid = B.item_id
WHERE
    A.class_level = 3
AND B.class_id = 1012
AND A.collect_date >= '2016-04-01'
AND A.collect_date <= '2016-05-31'
GROUP BY
    A.third_name_dictid
ORDER BY
    pv DESC;

实际查询时间用户0.6s左右

用explain 查看:
SQL from多表和 inner join的区别


这是from 多表写法

SELECT
    B.dict_data_name,
    A.PV
FROM
    (
        SELECT
            hn.third_name_dictid,
            SUM(hn.pv) AS PV
        FROM
            shw_mo_health_news hn
        WHERE
            hn.class_level = 3
        AND hn.collect_date >= '2016-04-01'
        AND hn.collect_date <= '2016-05-31'
        GROUP BY
            hn.third_name_dictid
    ) A,
    (
        SELECT
            dd.item_id,
            dd.dict_data_name
        FROM
            bas_dict_data dd
        WHERE
            dd.class_id = 1012
    ) B
WHERE
    A.third_name_dictid = B.item_id
ORDER BY
    PV DESC

实际用时0.03s左右

Explain查看
SQL from多表和 inner join的区别


为什么这两种查询方式的效率会有这么大的差别呢?
网上很多都说这两种写法的效率是差不多的;但是我这一个是0.6 和一个0.03,两者差别还是挺大的,这是什么原因造成的呢?是因为我写的SQl语句有问题还是别的原因?

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

下载

回复内容:

这是inner join写法

SELECT
    B.dict_data_name,
    SUM(A.pv) AS pv
FROM
    shw_mo_health_news A
INNER JOIN bas_dict_data B ON A.third_name_dictid = B.item_id
WHERE
    A.class_level = 3
AND B.class_id = 1012
AND A.collect_date >= '2016-04-01'
AND A.collect_date <= '2016-05-31'
GROUP BY
    A.third_name_dictid
ORDER BY
    pv DESC;

实际查询时间用户0.6s左右

用explain 查看:
SQL from多表和 inner join的区别


这是from 多表写法

SELECT
    B.dict_data_name,
    A.PV
FROM
    (
        SELECT
            hn.third_name_dictid,
            SUM(hn.pv) AS PV
        FROM
            shw_mo_health_news hn
        WHERE
            hn.class_level = 3
        AND hn.collect_date >= '2016-04-01'
        AND hn.collect_date <= '2016-05-31'
        GROUP BY
            hn.third_name_dictid
    ) A,
    (
        SELECT
            dd.item_id,
            dd.dict_data_name
        FROM
            bas_dict_data dd
        WHERE
            dd.class_id = 1012
    ) B
WHERE
    A.third_name_dictid = B.item_id
ORDER BY
    PV DESC

实际用时0.03s左右

Explain查看
SQL from多表和 inner join的区别


为什么这两种查询方式的效率会有这么大的差别呢?
网上很多都说这两种写法的效率是差不多的;但是我这一个是0.6 和一个0.03,两者差别还是挺大的,这是什么原因造成的呢?是因为我写的SQl语句有问题还是别的原因?

应该是连接损耗吧,我觉得是因为你使用的条件都没有索引造成的。如果字段进行了适当的索引,由于mysql会自动对sql语句优化的原因,最终查询语句是一样的,性能相同,而没有索引的的时候所谓的优化也就不存在了,这个时候最终查询语句基本等同于你提交的sql。
你可以试试

SELECT
    B.dict_data_name,
    SUM(A.pv) AS pv
FROM
    shw_mo_health_news A
INNER JOIN bas_dict_data B ON A.class_level = 3 and A.collect_date >= '2016-04-01'
AND A.collect_date <= '2016-05-31' and B.class_id=1012 and  A.third_name_dictid = B.item_id

GROUP BY
    A.third_name_dictid
ORDER BY
    pv DESC;

我觉得性能会明显不同。

一样的,属于 SQL-89 与 SQL-92 不同规范。参见 https://en.wikipedia.org/wiki...


查到一个相关问答,其中有个回答恰好是您这个问题的 https://community.microstrate...

这里第2个SQL由于有子查询会有额外的开销(临时表)。
第2个SQL为什么会比第1个SQL,根据执行计划并没有看出什么,感觉只是个例外并不能说明什么

理论上说,子查询和JOIN没有本质区别,在查询分析器合理的优化之后应该是等效的。但是也正是由于查询分析器的各种缺陷,有些时候有些版本的数据库对子查询支持得更好,有些则对JOIN支持得更好。MySQL来说我见过的大部分版本子查询和JOIN是等效的,但是要小心的是子查询位于WHERE中的场景,比如:

-- 查询1
SELECT * FROM table_a
WHERE A IN (
    SELECT A FROM table_b
    WHERE B = 'x'
)
-- 查询2
SELECT table_a.* FROM table_a A
    INNER JOIN table_b B ON a.A = b.A
WHERE B.B = 'x'

这就是一个典型的MySQL查询分析器失效的场景。table_aA字段有索引的情况下理论上查询1和查询2应该等效,但实际上MySQL 5.x的版本中查询2的性能要明显优于查询1。这在Stackoverflow上有人讨论,是一个存在近10年的已知问题。必须要升级到6.0.x才会得到修复。所以,对于哪个更优的问题,最可靠的办法只有自己去看explain的结果再下结论。
对于你的两个查询,其实执行计划都是不一样的,很明显第二个的消耗要更大,时间差不多只是因为多出来的两步得到的数据量并不太大。再者这两个查询其实也不是等价的,都无从比较。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

268

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

170

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

85

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号