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.pswp.cn/news/271067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271067.shtml
英文地址,請注明出處:http://en.pswp.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 類中使用 ?nal 關鍵字字符數組保存字符串, private final char value[] ,所以 String 對象是不可變的。 StringBuilder 與 StringBu?er 都繼承自 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 工作空間…