上午實習導師瀟哥考核了下業務知識,然後說給你們講下資料庫這邊的東西吧,然後balabala講了挺多有用的。
首先,資料庫優化的最基本規則有兩點:
1.減少io次數。
2.減少計算次數。(如果某查詢會常用到而且計算次數較多的話,應當放在一張表中以減少計算)
然後是索引,眾所周知索引是提高查詢效率的。
但是當查詢結果的字段數量佔表中所有字段數比重越多的時候,索引與全表掃瞄查詢的效率差值就越來越小,當到達乙個閾值,索引的效率甚至會低於全表掃瞄,這個閾值一般會在5%左右,也就是查詢結果數量佔全表的5%以下時,用索引的效率是很高的。
但是在現在這個規則不是很適用了,因為現在的資料庫中新增了乙個叫做cbo(cost based optimizer)的機制,會自動選擇更適合的執行方式(走索引還是全表掃瞄)。
然後是join,關係型資料庫之所以可以被稱所關係型資料庫的關鍵。
對join的優化,主要也是最基本的,就是調換join的順序。
1.若表a和表b均為1000w級別的表,c為1w級別的表,那麼 a join b join c where xx = xx 這條語句查詢數量級為1000w*1000w 以及1000w * 1w,而將順序換為a join c join b where xx = xx 後,數量及變為了1000w*1w和1w*1000w,數量級顯著降低了三個層級。
2.盡量避免無索引的大表(如兩個大表join後的結果集)去join另乙個表(無論此表有無索引),因為這會很慢。
解決辦法:hash join。這個是在oracle中內建的一中join方法,可以解決上面這種問題,原理是將兩個表先hash再join。現在定製的mysql也可以使用該方法。
索引工作模式圖
索引有b+tree索引、bitmap索引(僅oracle有)、reverse索引(翻轉索引)等,最常用的是b+tree索引。
b+tree索引
bitmap索引
reverse索引
下圖是乙個簡單的b+tree索引示意圖(圖引b+樹索引—水墨江南):
之前淺薄的接觸過事務,事務級別(或者稱為事務隔離級別)主要分為四級:read uncommitted(讀取未提交內容)、read committed(讀取提交內容)、repeatable read(可重讀)、serializable(可序列化),四級隔離程度依次公升高。
圖引: 事務隔離級別詳解
髒讀(drity read)
某個事務已更新乙份資料,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個rollback了操作,則後乙個事務所讀取的資料就會是不正確的。
不可重複讀(non-repeatable read)
在乙個事務的兩次查詢之中資料不一致,這可能是兩次查詢過程中間插入了乙個事務更新的原有的資料。
幻讀(phantom read)
在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾列(row)資料,而另乙個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的。
mysql-事務處理):
mysql的事務處理主要有兩種方法。
1、用begin,rollback,commit來實現
begin 開始乙個事務
rollback 事務回滾
commit 事務確認
2、直接用set來改變mysql的自動提交模式
mysql預設是自動提交的,也就是你提交乙個query,它就直接執行!我們可以通過
set autocommit=0 禁止自動提交
set autocommit=1 開啟自動提交
來實現事務的處理。
但注意當你用 set autocommit=0 的時候,你以後所有的sql都將做為事務處理,直到你用commit確認或rollback結束,注意當你結束這個事務的同時也開啟了個新的事務!按第一種方法只將當前的作為乙個事務!
個人推薦使用第一種方法!
mysql中只有innodb和bdb型別的資料表才能支援事務處理!其他的型別是不支援的!(切記!)
這次實習時候用的也是第一種事務方式,感覺也比較好使。
說一下鎖。
mysql中支援顯式鎖和隱式鎖。
innodb在開啟事務時,獲取隱式鎖,在事務提交或者回滾時釋放鎖,innodb根據隔離級別自動處理鎖。(文引:
高效能mysql學習筆記)
——————————先整理到這,歇會繼續整理————————————
——————————休息完畢,開始更新————————————
顯式鎖分兩種:
樂觀鎖與悲觀鎖
簡單來說,悲觀鎖是依賴資料庫本身帶的鎖機制實現的,比如select * from t_table where xx = xx for update;
而樂觀鎖的實現機制並不依賴於資料庫本身的鎖,而是用版本(version)管理實現。
例:一條資料
namebalanceversion
pandadru
$10000
管理員a對該記錄的balance進行操作:update t_table set balance=950 where name = pandadru version = 1 並提交。
管理員b此時也對該字段進行修改,update t_table set balance=950 where name = pandadru version = 1 並提交,因為樂觀鎖機制只允許version大於當前欄位的內容提交,所以管理員b的提交失敗。
以上只是個小例子,《
悲觀鎖和樂觀鎖》這篇文章對悲觀鎖和樂觀鎖講得比較詳細。
孫佳瀟的講座(主要)
b+樹索引—水墨江南
mysql-事務處理
事務隔離級別詳解
高效能mysql學習筆記
悲觀鎖和樂觀鎖
關於Oralce資料庫優化的幾點總結
個人理解,資料庫效能最關鍵的因素在於io,因為操作記憶體是快速的,但是讀寫磁碟是速度很慢的,優化資料庫最關鍵的問題在於減少磁碟的io,就個人理解應該分為物理的和邏輯的優化,物理的是指oracle產品本身的一些優化,邏輯優化是指應用程式級別的優化物理優化的一些原則 1 oracle的執行環境 網路,硬...
關於Oracle資料庫優化的幾點總結
個人理解,資料庫效能最關鍵的因素在於io,因為操作記憶體是快速的,但是讀寫磁碟是速度很慢的,優化資料庫最關鍵的問題在於減少磁碟的io,就個 人理解應該分為物理的和邏輯的優化,物理的是指oracle產品本身的一些優化,邏輯優化是指應用程式級別的優化物理優化的一些原則 1 oracle的執行環境 網路,...
關於Oralce資料庫優化的幾點總結
關於oralce資料庫優化的幾點總結 個人理解,資料庫效能最關鍵的因素在於io,因為操作記憶體是快速的,但是讀寫磁碟是速度很慢的,優化資料庫最關鍵的問題在於減少磁碟的io,就個人理解應該分為物理的和邏輯的優化,物理的是指oracle產品本身的一些優化,邏輯優化是指應用程式級別的優化物理優化的一些原則...