国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

MySQL中對(duì)表連接查詢的簡(jiǎn)單優(yōu)化教程

2020-01-18 22:39:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在MySQL中,A LEFT JOIN B join_condition執(zhí)行過(guò)程如下:

? 根據(jù)表A和A依賴的所有表設(shè)置表B。

? 根據(jù)LEFT JOIN條件中使用的所有表(除了B)設(shè)置表A。

? LEFT JOIN條件用于確定如何從表B搜索行。(換句話說(shuō),不使用WHERE子句中的任何條件)。

? 可以對(duì)所有標(biāo)準(zhǔn)聯(lián)接進(jìn)行優(yōu)化,只是只有從它所依賴的所有表讀取的表例外。如果出現(xiàn)循環(huán)依賴關(guān)系,MySQL提示出現(xiàn)一個(gè)錯(cuò)誤。

? 進(jìn)行所有標(biāo)準(zhǔn)WHERE優(yōu)化。

? 如果A中有一行匹配WHERE子句,但B中沒(méi)有一行匹配ON條件,則生成另一個(gè)B行,其中所有列設(shè)置為NULL。

? 如果使用LEFT JOIN找出在某些表中不存在的行,并且進(jìn)行了下面的測(cè)試:WHERE部分的col_name IS NULL,其中col_name是一個(gè)聲明為 NOT NULL的列,MySQL找到匹配LEFT JOIN條件的一個(gè)行后停止(為具體的關(guān)鍵字組合)搜索其它行。

RIGHT JOIN的執(zhí)行類(lèi)似LEFT JOIN,只是表的角色反過(guò)來(lái)。

聯(lián)接優(yōu)化器計(jì)算表應(yīng)聯(lián)接的順序。LEFT JOIN和STRAIGHT_JOIN強(qiáng)制的表讀順序可以幫助聯(lián)接優(yōu)化器更快地工作,因?yàn)闄z查的表交換更少。請(qǐng)注意這說(shuō)明如果執(zhí)行下面類(lèi)型的查詢,MySQL進(jìn)行全掃描b,因?yàn)長(zhǎng)EFT JOIN強(qiáng)制它在d之前讀取:

SELECT *FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)WHERE b.key=d.key;

在這種情況下修復(fù)時(shí)用a的相反順序,b列于FROM子句中:

SELECT *FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)WHERE b.key=d.key;

MySQL可以進(jìn)行下面的LEFT JOIN優(yōu)化:如果對(duì)于產(chǎn)生的NULL行,WHERE條件總為假,LEFT JOIN變?yōu)槠胀?lián)接。

例如,在下面的查詢中如果t2.column1為NULL,WHERE 子句將為false:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

因此,可以安全地將查詢轉(zhuǎn)換為普通聯(lián)接:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

這樣可以更快,因?yàn)槿绻梢允共樵兏眩琈ySQL可以在表t1之前使用表t2。為了強(qiáng)制使用表順序,使用STRAIGHT_JOIN。

以及先過(guò)濾條件然后再根據(jù)表連接 同時(shí)在表中建立相關(guān)查詢字段的索引這樣在大數(shù)據(jù)多表聯(lián)合查詢的情況下速度相當(dāng)快,可以來(lái)看一下下面這個(gè)例子中的寫(xiě)法:

SELECT M.*,SS.SensorCode,SS.SensorStatus,SS.ManufacturerId,SS.Electricity,SS.Voltage,SS.MinElectricity,SS.MinVoltage,SS.Temperature,SS.StatusUpdteDate,SS.UpdateStatus ,tp.PricingStrategyid,tps.FreeDuration,bat.BerthTypeId FROM(SELECT T.* , BS.ParkStatus,BS.ChangeTime ,CA.CantonName, SE.SectionName FROM(SELECT A.* ,B.BerthId,B.BerthCode,B.BerthAddress,B.BerthStatus,B.LineDirection,B.CantonId,B.SectionId FROM (SELECT AR.AreaId,AR.AreaCode,AR.AreaName FROM  SYS_Area AS AR WHERE 1=1  AND AR.AreaCode='110' ) A LEFT JOIN SYS_Berth AS B ON B.AreaId=A.AreaId ) TJOIN SYS_BerthStatus AS BS ON T.BerthCode=BS.BerthCode JOIN SYS_Canton AS CA ON T.CantonId=CA.CantonId JOIN SYS_Section AS SE ON T.SectionId=SE.SectionId )MLEFT JOIN SYS_Sensor SS ON M.BerthCode=SS.BerthCode LEFT JOIN TRA_PricingBerth AS tp ON tp.BerthCode=M.BerthCode  LEFT JOIN TRA_PricingStrategy AS tps ON tps.PricingStrategyId=tp.PricingStrategyId LEFT JOIN SYS_BerthAndType AS bat ON bat.BerthCode=M.BerthCode ORDER BY BerthCode ASC

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 土默特左旗| 九江县| 南投市| 屯门区| 亚东县| 宣汉县| 紫金县| 桃源县| 宁城县| 同仁县| 莱芜市| 抚顺市| 将乐县| 庐江县| 吉水县| 乐业县| 胶州市| 丰县| 洛阳市| 河池市| 东港市| 浦城县| 东丽区| 清远市| 和田县| 潜山县| 松阳县| 盐源县| 荃湾区| 成安县| 巫溪县| 益阳市| 阜阳市| 武川县| 衡水市| 同德县| 邛崃市| 江津市| 大姚县| 北票市| 杂多县|