php join a.id b.id,mysql求助 请问where a.id=b.id 和join on a.id=b.id 在效率上的区别

下面是ecshop 的商品表和品牌表的查询,请问它们的查询效率有什么区别呢?

还有一个问题是 left join 和join的效率哪个高一点呢。

谢谢 !!

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS aLEFT JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`

回复讨论(解决方案)

你的第一式是左链接,因无其他过滤条件

结果集中将会有左表(ecs_goods)的全部记录

你的第二式是逗号连接(INNER JOIN 的简写)

结果集中只会出现符合连接条件的记录

两者的作用是不同的,不能做效率比较

当右表(ecs_brand)有过滤条件时

左连接退化为内连接,两式就一样了,没有差别

你的第一式是左链接,因无其他过滤条件

结果集中将会有左表(ecs_goods)的全部记录

你的第二式是逗号连接(INNER JOIN 的简写)

结果集中只会出现符合连接条件的记录

两者的作用是不同的,不能做效率比较

版主 那是不是第一个sql删去left,就和第二个sql完全一样的呢。

它们在效率和索引使用方面有没区别的呢。

当右表(ecs_brand)有过滤条件时

左连接退化为内连接,两式就一样了,没有差别

版主 谢谢你的回答。我还有个问题

比如商品必须选择品牌,就是商品必定存在品牌id。

然后是品牌表肯定有商品的品牌。

所以它们用left join,或是join 返回的结果是一样的。 那这样它们可以进行效率对比吗。

由于连接外有过滤条件,所以 mysql 会将你的查询指令优化成内连接。因此就不存在效率的对比了

当然这里可以对比的是:

在商品表中查品牌商品 和 在品牌表中查商品

两者的效率是不一样的

因为品牌表显然要比商品表小

由于连接外有过滤条件,所以 mysql 会将你的查询指令优化成内连接。因此就不存在效率的对比了

当然这里可以对比的是:

在商品表中查品牌商品 和 在品牌表中查商品

两者的效率是不一样的

因为品牌表显然要比商品表小

版主 谢谢你的回答

我总结了一下你的回答:

第一点:SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS aJOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`

两句sql是完全一样的 mysql会将第一条sql优化成第二条。

第二点:

“在商品表中查品牌商品 和 在品牌表中查商品”

就是说

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS aJOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM ecs_brand AS bJOIN `ecs_goods` AS a ON b.`brand_id`=a.`brand_id`

两句sql的效率是不一样的。

//

以上两点描述正确吗 ?我有没理解错你的意思呢。

如果没有 那第二点大家处理方式都是笛卡尔积。

我的理解是 如果是 ecs_goods` AS a JOIN ecs_brand AS b

那就是商品表的一条记录 扫描品牌表的所有记录。如果有10个商品 10个品牌

那就是10*10=100 扫描了100次

反过来ecs_brand AS b JOIN `ecs_goods` AS a

一个品牌扫描10个商品 那扫描次数也是100次。 那为什么它们的效率不一样呢

呵呵,你自己偷换概念,给自己上个套!完全是为了你的错误观点SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`和

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a INNER JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`

是等效的

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a LEFT JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`WHERE b.`field_name`= 123

会被 mysql 优化为

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`AND b.`field_name`= 123

呵呵,你自己偷换概念,给自己上个套!完全是为了你的错误观点SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`和

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a INNER JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`

是等效的

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a LEFT JOIN ecs_brand AS b ON a.`brand_id` = b.`brand_id`WHERE b.`field_name`= 123

会被 mysql 优化为

SELECT a.`goods_id` , a.`goods_name` , b.brand_nameFROM `ecs_goods` AS a, ecs_brand AS bWHERE a.`brand_id` = b.`brand_id`AND b.`field_name`= 123

版主 这两条语句我试了一下,好像是不相等的阿。

-- -- 表的结构 `good_tbl`-- CREATE TABLE `good_tbl` ( `good_id` int(10) unsigned NOT NULL auto_increment, `brand_id` int(10) unsigned NOT NULL, PRIMARY KEY (`good_id`)) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=4 ;-- -- 导出表中的数据 `good_tbl`-- INSERT INTO `good_tbl` VALUES (1, 2);INSERT INTO `good_tbl` VALUES (2, 3);INSERT INTO `good_tbl` VALUES (3, 2);

-- -- 表的结构 `brand_tbl`-- CREATE TABLE `brand_tbl` ( `brand_id` int(10) unsigned NOT NULL auto_increment, `brand_name` varchar(50) NOT NULL, PRIMARY KEY (`brand_id`)) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=4 ;-- -- 导出表中的数据 `brand_tbl`-- INSERT INTO `brand_tbl` VALUES (1, '诺基亚');INSERT INTO `brand_tbl` VALUES (3, '三星');

版主 请问这些mysql的资料在哪里可以找到的呢,比如怎样知道某些语句在mysql里面会优化成另外的语句呢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库设计:数据库应用系统的生命周期

数据库应用系统的生命周期可以划分为:数据库规划、需求描述与分析、数据库与应用程序设计、数据库设计实现、数据库测试、数据库运维。1、数据库规划 数据库规划是创建数据库应用系统的第一步,也是数据库应用系统的任务描述和目标的明确。数据库规划的内…

从零开始,做一个NodeJS博客(四):服务器渲染页面与Pjax

标签: NodeJS 0 一个星期没更新了 一直在忙着重构代码,以及解决重构后出现的各种bug 现在CSS也有一点了,是时候把遇到的各种坑盘点一下了 1 听歌排行 API 修复与重构 1.1 修复 在加载云音乐听歌排行的时候,有时会出现一个奇怪的…

java 简单事件的使用,如何正确的使用Java事件通知(1)

如何正确的使用Java事件通知(1)通过实现观察者模式来提供 Java 事件通知(Java event notification)似乎不是件什么难事儿,但这过程中也很容易就掉进一些陷阱。本文介绍了我自己在各种情形下,不小心制造的一些常见错误。Java 事件通知让我们从一个最简单的…

Java 自动装箱与拆箱

Java 自动装箱与拆箱 装箱就是自动将基本数据类型转换为包装器类型(int–>Integer);调用方法:Integer 的 valueOf(int) 方法 拆箱就是自动将包装器类型转换为基本数据类型(Integer–>int)。调用方法…

基本系统设备感叹号_win7系统网络图标显示感叹号的问题

有系统之家的小伙伴,在使用win764位纯净版系统上网的时候,出现网络图标显示感叹号的问题。这种问题我们可以通过在网络检测修复中进行自行检测。或者是检查一下是不是硬件设备的问题。详细解决步骤就来看下系统哥小编是怎么做的吧~win7 64系统无法上网显…

LVM逻辑卷,RAID磁盘阵列

磁盘管理: 有关硬盘的识别,linux根据设备类型对存储设备进行识别,如果是IDE设备, 在计算机中会被识别为hd,第一个IDE设备会被识别为hda,第二个IDE设备会被识别为hdb,依次类推。如果是SATA,USB,S…

硬件编程:STM32串口发送数据和接收数据方式总结!

串口发送数据1、串口发送数据最直接的方式就是标准调用库函数 。void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);第一个参数是发送的串口号,第二个参数是要发送的数据,但是用过的朋友应该觉得不好用,一次只能发送单个字符&#…

Java编程题修院子,了解java虚拟机—JVM相关参数设置(2)

1. JVM相关参数设置JVM相关配置-XX:PrintGC两次次YoungGC,两次FullGC。-XX:PrintGCDetails打印GC时的内存,并且在程序结束时打印堆内存使用情况-XX:PrintHeapAtGC每次GC时会分别打印回收前与回收后堆信息-XX:PrintGCTimeStamps选择打印GC的方式后&…

此异常最初是在此调用堆栈中引发的:_【8】进大厂必须掌握的面试题Java面试异常和线程...

点击上方“全栈程序员社区”,星标公众号重磅干货,第一时间送达Q1。错误和异常有什么区别?错误是在运行时发生的不可恢复的情况。如OutOfMemory错误。这些JVM错误无法在运行时修复。尽管可以在catch块中捕获错误,但是应用程序的执行…

高仿带感魔性病毒源码+成品(最近很火的)

高仿带感魔性病毒源码成品(最近很火的)娱乐使用。没破坏性 会改壁纸和打乱桌面图标顺序 自己改回来就好 演示地址: 下载地址:链接: http://pan.baidu.com/s/1dF2ZlU5 密码: m95p转载于:https://www.cnblogs.com/blogwy/p/5804711.…

数据库设计:数据库设计的基本步骤介绍

数据库设计主要包括用户需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施阶段、数据库运行和维护阶段等六个阶段。1、用户需求分析 数据库设计人员采用相应的辅助工具对应用对象的功能、性能、限制等要求进行科学实际的分析。2、概念结构设计 概念结构设计主要…

Hashcode 的作用

java 的集合有两类,一类是 List,还有一类是 Set。前者有序可重复,后者无序不重复。当我们在 set 中插入的时候怎么判断是否已经存在该元素呢,可以通过 equals 方法。但是如果元素太多,用这样的方法就会比较满。 于是有…

坎蒂雷赋权法 matlab,干货 | 利用MATLAB实现FMCW雷达中的常用角度估计方法

其中在介绍角度估计中,通过对接收差频信号在快慢时间维度的扩展,增加了空域的信息。扩展后的接收差频信号可以表示为其中k表示接收天线的个数,d为天线间距。在“干货|利用MATLAB实现FMCW雷达的角度估计”中,已经介绍了如何理解目标…

vscode 使用笔记

https://code.visualstudio.com/docs/setup/setup-overview#_proxy-server-support 如果使用代理上网时,需要配置: 在 settings.json 中这样设定: // 将设置放入此文件中以覆盖默认设置{"http.proxy": "http://用户名:密码IP:…

数据库设计基础:需求分析相关知识笔记

系统需求分析是用户和相关设计人员对数据库应用系统所涉及的内容和功能描述,主要是以用户角度来了解系统,是数据库逻辑设计和物理设计以及应用程序的涉及都根据系统分析的内容作为基础。该阶段是非常重要的环节,如果该阶段设计的不好&#xf…

matlab 康托尔集,康托尔集的性质特点

康托尔集的性质特点康托三分集中有无穷多个点,所有的点处于非均匀分布状态。此点集具有自相似性,其局部与整体是相似的,所以是一个分形系统。康托三分集具有(1)自相似性;(2)精细结构;(3)无穷操作或迭代过程&#xff1b…

String、StringBuuffer、StringBuilder三者的区别

可变性 String 类中使用 final 关键字字符数组保存字符串, private final char value[] ,所以 String 对象是不可变的。 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存…

运算符和类型转换

1.类型转换: 分为自动转换和强制转换,一般用强制转换。 其他类型转换为整数:parseInt(); 其他类型转换为小数:parseFloat(); 判断是否是一个合法的数字类型&a…

数据库设计基础:数据字典相关知识笔记

1、数据字典的定义 数据字典(Data Dictionary ,DD)是各类数据描述的集合,它是关于数据库中数据的描述,即元数据,而不是数据本身。2、数据字典的组成数据字典主要包括数据项、数据结构、数据流、数据存储、处理过程等内…

用符号方法求下列极限或导数matlab,matlab实验

3,设有矩阵A 和B 1234530166789101769A ,111213141502341617181920970212223242541311B ????????-????????-????????????????1、求它们的乘积C ;2、将矩阵C 的右下角3*2子矩阵赋给D ;3、察看matlab 工作空间…