MySQL中對表銜接查詢的簡略優化教程。本站提示廣大學習愛好者:(MySQL中對表銜接查詢的簡略優化教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中對表銜接查詢的簡略優化教程正文
在MySQL中,A LEFT JOIN B join_condition履行進程以下:
· 依據表A和A依附的一切表設置表B。
· 依據LEFT JOIN前提中應用的一切表(除B)設置表A。
· LEFT JOIN前提用於肯定若何從表B搜刮行。(換句話說,不應用WHERE子句中的任何前提)。
· 可以對一切尺度聯接停止優化,只是只要從它所依附的一切表讀取的表破例。假如湧現輪回依附關系,MySQL提醒湧現一個毛病。
· 停止一切尺度WHERE優化。
· 假如A中有一行婚配WHERE子句,但B中沒有一行婚配ON前提,則生成另外一個B行,個中一切列設置為NULL。
· 假如應用LEFT JOIN找出在某些表中不存在的行,而且停止了上面的測試:WHERE部門的col_name IS NULL,個中col_name是一個聲明為 NOT NULL的列,MySQL找到婚配LEFT JOIN前提的一個行後停滯(為詳細的症結字組合)搜刮其它行。
RIGHT JOIN的履行相似LEFT JOIN,只是表的腳色反過去。
聯接優化器盤算表應聯接的次序。LEFT JOIN和STRAIGHT_JOIN強迫的表讀次序可以贊助聯接優化器更快地任務,由於檢討的表交流更少。請留意這解釋假如履行上面類型的查詢,MySQL停止全掃描b,由於LEFT JOIN強迫它在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;
在這類情形下修復時用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可以停止上面的LEFT JOIN優化:假如關於發生的NULL行,WHERE前提總為假,LEFT JOIN變成通俗聯接。
例如,鄙人面的查詢中假如t2.column1為NULL,WHERE 子句將為false:
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
是以,可以平安地將查詢轉換為通俗聯接:
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
如許可以更快,由於假如可使查詢更佳,MySQL可以在表t1之前應用表t2。為了強迫應用表次序,應用STRAIGHT_JOIN。
和先過濾前提然後再依據表銜接 同時在表中樹立相干查詢字段的索引如許在年夜數據多表結合查詢的情形下速度相當快,可以來看一下上面這個例子中的寫法:
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 ) T JOIN 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 )M LEFT 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