MySQL中對表連接查詢的簡單優(yōu)化教程
在MySQL中,A LEFT JOIN B join_condition執(zhí)行過程如下:
· 根據(jù)表A和A依賴的所有表設置表B。
· 根據(jù)LEFT JOIN條件中使用的所有表(除了B)設置表A。
· LEFT JOIN條件用于確定如何從表B搜索行。(換句話說,不使用WHERE子句中的任何條件)。
· 可以對所有標準聯(lián)接進行優(yōu)化,只是只有從它所依賴的所有表讀取的表例外。如果出現(xiàn)循環(huán)依賴關系,MySQL提示出現(xiàn)一個錯誤。
· 進行所有標準WHERE優(yōu)化。
· 如果A中有一行匹配WHERE子句,但B中沒有一行匹配ON條件,則生成另一個B行,其中所有列設置為NULL。
· 如果使用LEFT JOIN找出在某些表中不存在的行,并且進行了下面的測試:WHERE部分的col_name IS NULL,其中col_name是一個聲明為 NOT NULL的列,MySQL找到匹配LEFT JOIN條件的一個行后停止(為具體的關鍵字組合)搜索其它行。
RIGHT JOIN的執(zhí)行類似LEFT JOIN,只是表的角色反過來。
聯(lián)接優(yōu)化器計算表應聯(lián)接的順序。LEFT JOIN和STRAIGHT_JOIN強制的表讀順序可以幫助聯(lián)接優(yōu)化器更快地工作,因為檢查的表交換更少。請注意這說明如果執(zhí)行下面類型的查詢,MySQL進行全掃描b,因為LEFT JOIN強制它在d之前讀?。?/p>
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優(yōu)化:如果對于產(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;
這樣可以更快,因為如果可以使查詢更佳,MySQL可以在表t1之前使用表t2。為了強制使用表順序,使用STRAIGHT_JOIN。
以及先過濾條件然后再根據(jù)表連接 同時在表中建立相關查詢字段的索引這樣在大數(shù)據(jù)多表聯(lián)合查詢的情況下速度相當快,可以來看一下下面這個例子中的寫法:
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
相關文章
mysql數(shù)據(jù)庫添加用戶及分配權(quán)限具體實現(xiàn)
這篇文章主要介紹了mysql數(shù)據(jù)庫添加用戶及分配權(quán)限的方法,需要的朋友可以參考下2014-02-02
Mybatis集成MySQL使用游標查詢處理大批量數(shù)據(jù)方式
這篇文章主要介紹了Mybatis集成MySQL使用游標查詢處理大批量數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
mysql 5.0.67最新版替代MySQL 5.0.51b版本官方下載
發(fā)布說明MySQL服務器5.0.67 ( 2008年8月4日) 這是一個bugfix釋放現(xiàn)有生產(chǎn)釋放的家庭。它取代MySQL的5.0.51b 。2008-08-08
MySQL 給用戶添加 ALTER VIEW 的權(quán)限的步驟
在 MySQL 中,用戶權(quán)限的管理是非常重要的,以確保數(shù)據(jù)庫安全性和數(shù)據(jù)完整性,這篇文章主要介紹了MySQL 給用戶添加 ALTER VIEW 的權(quán)限,需要的朋友可以參考下2024-05-05

