華為程序員面試題:調整SQL的執行順序,對性能有沒有影響
每年的3,4月份都是求職的高峰期,今天我們來分享一個經典的面試題,這個題目是來自一位粉絲最近參與的一次華為面試后臺工程師面試。
我們有一個交易系統,每當發生一次交易操作的時候,會發生下面幾個事情,增加一條交易記錄,買家的金額減少X元,賣家的金額增加X元。很顯然,為了保證數據的一致性,我們需要在事務下完成這三個操作,那么,這3條sql的執行順序,對系統的系能有沒有什么影響呢?
大家都知道,在數據庫中,如果有多個不同的任務同時對同一行數據有更新,那么就可能會出現并發問題。為了解決這個問題,Mysql有著復雜的鎖的機制,一般情況下,我們這種只更新某一行的數據通常使用的的是Mysql的行鎖。同時在所有的數據庫操作中,我們必須保證一個狀態到另外一個狀態的數據一致性,也就是事務,那么Mysql的事務跟鎖有什么關系呢?
Mysql的行鎖,是在需要的時候申請,但并不是立馬釋放,而是等到事務結束后才釋放,我們稱之為二階段協議。基于這樣的一種設定,如果我們要提高系統的整體性能,就要讓等到鎖的時間越少越好,也就是并發越高的修改,放到越后面,這樣子,就能夠在處理完當前數據庫操作之后,盡快地提交事務,并釋放鎖,交給下一個任務。
在上述例子中,增加一條交易記錄,一般都是追加的操作,不需要加鎖,而給買家的金額減X元,通常,一個買家同一時間內,都不會有并發,即使有(例如手機,APP同時下單付款等)那也是非常小的概率事件,但是對于賣家就不一定了,特別是一些爆品,賣家設置可能在1秒鐘內完成數百次甚至上千次并發。所以,我們應該把賣家金額的變更放到最后,那樣能夠很大程度地提升系統的性能。