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里面会优化成另外的语句呢。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸
