學習記錄 關於資料庫優化的幾點知識以及事務和鎖

2021-06-23 08:36:01 字數 3334 閱讀 4360

上午實習導師瀟哥考核了下業務知識,然後說給你們講下資料庫這邊的東西吧,然後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產品本身的一些優化,邏輯優化是指應用程式級別的優化物理優化的一些原則...