2013-01-24 56 views
2

我正在使用mysql數據庫,現在我必須確保列中的值應該是1,而它可能已經是1。因此,考慮以下兩個語句:在更新mysql中的某一行時,哪種語句在有或沒有附加條件時效率更高

UPDATE category SET is_leaf=1 WHERE id=9 

UPDATE category SET is_leaf=1 WHERE id=9 AND is_leaf=0 

id是主鍵,不同的是,當is_leaf已經是1,則進行更新或沒有,這是更有效?

我知道這並不重要,但我想找出更好的理解mysql。

回答

1

與包括可以更有效地有時AND is_leaf=0查詢。

找到基於主鍵的行時不會有太大的區別。 (索引on (id,is_leaf)的可用性可能會產生一點差異。)但是,只要MySQL確定沒有要更新的行,它可以採用較短的代碼路徑。

但是,如果缺少謂詞,MySQL將不得不查找該行,獲取行鎖(對於InnoDB),並觸發任何'BEFORE UPDATE FOR EACH ROW'觸發器。然後,MySQL必須檢查是否有任何列值實際上正在更改(請注意,觸發器的執行可能會將一列或多列設置爲不同的值)。如果MySQL檢測到行沒有變化,它可以跳過任何'ON UPDATE'時間戳列的設置,觸發任何'AFTER UPDATE FOR EACH ROW'觸發器,並將受影響的行計數爲零。 (在一個事務的上下文中,一旦確定行沒有被更改,MySQL是否可以釋放行鎖,或者是否在提交或回滾之前,行鎖將繼續保留)。

所以,這兩個語句之間的一個很大的區別在於即使沒有對該行進行實際更改,MySQL也會觸發'FOR EACH ROW'觸發器;但它不會爲WHERE子句排除的行觸發任何'FOR EACH ROW'觸發器。

在簡單的情況下,沒有任何觸發器,我不認爲在性能上有任何可測量的差異。

我個人的偏好是包含額外的謂詞。這確保了不會(InnoDB)意向行鎖被請求或保持,並且不會觸發FOR EACH ROW觸發器。


而且除了行鎖定和觸發執行,只要這兩個聲明是完全一樣的,他們是不是真的。在一般情況下,其中存在一種可能性,即可以is_leaf包含NULL或鑑於這種語句不是0或1。

其他值至少不:

UPDATE category SET is_leaf=1 WHERE id=9 

對於設置is_leaf等效聲明到1時,它是不是已經等於1,我們實際上需要檢查NULL,比1不同的任何值,如:

UPDATE category SET is_leaf=1 WHERE id=9 AND NOT (is_leaf <=> 1) 

考慮當is_leaf爲空或2會發生什麼,例如,有這個狀態NT:

UPDATE category SET is_leaf=1 WHERE id=9 AND is_leaf=0 
+0

當我們設置一個值爲'1'的時候,它已經是'1'了,那麼mysql將會1)檢查它是否會被實際改變,然後決定是否更新它;或2)無論如何更新它,然後監視它是否已被更改?如果這是第一種情況,那麼我認爲這兩個語句完全一樣(除了第二個語句需要更少的行鎖)。 –

+0

代碼路徑部分非常有幫助! –

2
UPDATE category SET is_leaf=1 WHERE id=9 AND is_leaf=0 

更有效率。因爲那時它只更新相關數據。否則即使is_leaf=1記錄也要更新。

假設表中有1000條記錄,並且需要1秒才能更新一條記錄。如果你試圖更新所有記錄,那麼它將花費1000秒,但假設在這種情況下有is_leaf=0記錄數是150,那麼如果你使用這第二個語句,它將只需要150秒而不是1000秒。

編輯:

查詢使用搜索參數(SARG)

WHERE子句可以幫助你限制查詢返回的行數。但是,指定WHERE條件的方式會影響查詢的性能。如果寫入WHERE條件以使其使用將索引列作爲輸入的函數,那麼將忽略該索引並掃描整個表。這會導致性能下降。 例如,在表掃描的結果如下,因爲列訂購日期是在函數中使用:

SELECT CustomerID, EmployeeID FROM Orders 
WHERE DATEDIFF(m, OrderDate, GetDate())>3 

如果如下所示的函數被重寫,則查詢試圖使用索引所需要的值和這個改善性能:

SELECT CustomerID, EmployeeID FROM Orders 
WHERE OrderDate < DATEADD(m, -3, GetDate()) 

在第二查詢中的過濾器條件據說用可搜索的參數或SARG因爲查詢優化器可以使用索引執行期間查找操作。

有關的更多信息,你更好地閱讀improving query performance

,也閱讀了Speeding up Searches and Filters

+0

是否有任何實驗證據支持這一點?因爲附加條件需要更多時間來檢查,例如,檢查其值是否爲0,然後進行更新或僅更新它而不進行檢查,問題是哪個成本更高,檢查或更新? –

相關問題