Neo's Blog

首頁 相本 討論 書籤

分類目錄
本站日誌 (51)
碎碎唸啦 (173)
網站架設 (84)
程式設計 (161)
軟體使用 (69)
電子商務 (126)
經營奇想 (48)
基金理財 (11)
聰明消費 (87)
電影心得 (47)
開放原碼 (16)
工作記錄 (2)
毛毛小記 (9)
就是不同 (2)




歷史資料
 




April 14, 2005
[MySQL] 造成資料庫 Lock 的 JOIN SQL

這篇是寫給我自己看的。如果有興趣一起研究的人再來討論囉! ^^

昨天(4/13)去華X銀看系統,這二天很明顯都是因為下面這個 SQL 指令造成重要的 Table 都被 Lock 住。


<sql:query var="result" startRow="${param.startRow}" maxRows="${param.maxRows}" >
SELECT branch_box.*,
box.name,
rent.customer_id,
customer.name AS customer_name,
rent.start_date,
rent.due_date
FROM box,branch_box
LEFT OUTER JOIN rent ON branch_box_id= branch_box.id
LEFT JOIN customer ON rent.customer_id = customer.id
WHERE branch_box.branch_id='${param.branch_id}'
AND box.id = branch_box.box_id
AND box.id = ${param.box_id}
<c:if test="${param.search_branch_box_number!=''}">
AND branch_box.number = '${param.search_branch_box_number}'
</c:if>
ORDER BY box_id, CAST(number AS UNSIGNED)
</sql:query>

因為這支程式執行時間特別久,加上在 MySQL 的 Process 裡面看的很清楚,執行二個表單以上的 JOIN 指令時,MySQL 會 Copy 到一個 temp table,可能這段有 OUTER JOIN 的關係,造成 copy tmp table 的時間非常的長,此時 rent 、 customer 這二個重要的 table 也都因此被 lock,造成很多使用者要等這個指令執行完才能使用。

昨晚在華X銀在程式把上面那段SQL拆開來改寫,經測試速度上已達到感覺不出來有在執行這支程式了。等今天睡起來之後去華X銀再測試記憶體佔用的情形。

 
由 Neo 發表於 April 14, 2005 12:41 AM 收進你的MyShare個人書籤  

是完全把兩的table的資料分開SQL查詢嗎?
原來outer join 這麼影響效能,我也要去看看我的程式

===
看了你幾篇BLOG文章,覺得你寫的很棒喲!
謝謝你的經驗分享


Moving 發表於 December 13, 2005 11:37 PM

Moving:

多謝你的誇獎喔~^^

因為銀行用的系統量大,所以只要資料庫 Lock 稍微久一點影響就很大,一般的系統會不會碰到就不知道了。^^

Neo


Neo 發表於 December 14, 2005 10:30 PM

LEFT OUTER JOIN rent ON branch_box_id= branch_box.id

LEFT JOIN customer ON rent.customer_id = customer.id
是這邊^^^^乘開了
用rent資料數Xcustomer資料數


Lussda 發表於 November 26, 2007 09:32 PM
發表迴響  
(*星號開頭為必填欄位)











(請輸入您看到的數字,看不到請按右鍵->顯示圖片)


記住我的資訊?







Copyright 2005 Neo's Blog All rights reserved.