資料庫相關知識以及經驗總結

2021-08-14 13:42:57 字數 3938 閱讀 7785

已停更,轉移至有道雲筆記

mysql 優化之explain你的select ,show profile, 慢查詢

explain select * from answer where question_id in(4007,4008,4009) and score>0;其中questionid有索引而 score沒有

1) select_type表示的是簡單的select語句。

2) type all表示全表掃瞄。

3) possible_keys 表示有可能是用了快取。

索引分類

1)從資料結構來說b樹,b+ 樹

2)從物理結構來說 聚集索引(一張表只有乙個),費聚集索引(字典裡面以偏旁部首查詢時)

3)從邏輯結構來說  主鍵索引:主鍵索引是一種特殊的唯一索引,不允許有空值 單列索引 多列索引 唯一索引或者非唯一索引(普通索引) 唯一索引:它通過確保表中沒有兩個資料行具有完全相同的鍵值來幫助維護資料完整性 直接索引 間接索引

索引的優點:通過建立唯一索引,可以保證資料庫表中每行資料的唯一性,可以加快資料的查詢速度,通過使用索引,可以在查詢中使用優化隱藏器,提高系統的效能。

缺點:建立索引和維護索引要耗費時間,並且隨著資料量的增加耗費時間也增加.索引需要佔空間記憶體,在對錶中資料進行增加,刪除和修改的時候,索引也需要動態維護,這樣降低了資料維護速度.

事務的隔離級別

1)未提交讀(read uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料 會導致髒讀,不可重複讀,幻讀

資料庫一般都不會用,而且任何操作都不會加鎖.

2)提交讀(read committed):只能讀取到已經提交的資料。oracle等多數資料庫預設都是該級別 (不重複讀) 會導致不可重複讀,幻讀

teacher_id是有索引的,如果沒有的話,就是說如果乙個條件無法通過索引快速過濾,儲存引擎層面就會將所有記錄加鎖後返回,再由mysql server層進行過濾。但是發現不滿足之後.會呼叫unlock_row方法,把不滿足條件的記錄釋放鎖 (違背了二段鎖協議的約束)。這樣做,保證了最後只會持有滿足條件記錄上的鎖,但是每條記錄的加鎖操作還是不能省略的。可見即使是mysql,為了效率也是會違反規範的

3)可重複讀(repeated read):可重複讀。在同乙個事務內的查詢都是事務開始時刻一致的,innodb預設級別。在sql標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀

乙個資料量很大的表做批量修改的時候,如果無法使用相應的索引,mysql server過濾資料的的時候特別慢,就會出現雖然沒有修改某些行的資料,但是它們還是被鎖住了的現象。乙個個鎖,再分別解鎖

select時,讀取建立版本號<=當前事務版本號,刪除版本號為空或》當前事務版本號。 沒加鎖,通過版本號執行的

insert時,儲存當前事務版本號為行的建立版本號

delete時,儲存當前事務版本號為行的刪除版本號

update時,插入一條新紀錄,儲存當前事務版本號為行建立版本號,同時儲存當前事務版本號到原來刪除的行

這樣做業務上來說並不是最新的資料,有些業務需要最新的資料:

在每個讀的資料行上都加了共享鎖,可能導致大量的超時和鎖競爭. 給個客戶加鎖.

4)序列讀(serializable):完全序列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞 所有操作都要序列執行

不可重複讀:是指在乙個事務內,多次讀同一資料 每次讀取的數值不一樣,因為第一次讀跟第二次讀之間可能有別的事務更改了。

幻讀: 注意id為1是一班

悲觀鎖 讀也加鎖,其他也加鎖

樂觀鎖 如上鎖述

資料庫鎖機制

表級鎖:粒度大 由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題 表級鎖分為讀鎖和寫鎖

頁級鎖定:會發生死鎖 粒度介於

行級鎖定 最容易發生死鎖,粒度最小 innodb的行級鎖同樣分為兩種,共享鎖和排他鎖

sql注入

就是通過把sql命令插入到web 表單 提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令

資料庫三大正規化

1)1nf是指資料庫中表的每一列都是不可分割的基本資料項,同一列的資料不能有多個值。

2)第二正規化就是非主屬性不能部分依賴於主關鍵字。

3)3nf是 消除傳遞依賴(每一列資料都和主鍵直接相關,而不能間接相關)

4)bcnf表屬性不能依賴其他表中非主鍵的屬性。 以上幾種都要符合更上層的

事務acid

原子性:指整個資料庫事務是不可分割的工作單位。只有使據庫中所有的操作執行成功,才算整個事務成功;

一致性:指資料庫事務不能破壞關係資料的完整性以及業務邏輯上的一致性。比如轉賬

隔離性:指的是在併發環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間。由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。事務檢視資料更新時,資料所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視到中間狀態的資料。

永續性:指的是只要事務成功結束,它對資料庫所做的更新就必須永久儲存下來。

資料庫分頁查詢

select * from table where … limit 10,20; #返回第10-20行資料

資料庫連線池原理

傳統的資料庫連線方式是,使用者每次請求都要向資料庫獲取連線,而資料庫連線的建立和關閉需要一定的開銷。頻繁的建立、關閉資料庫,會極大的降低系統的效能,增大系統的開銷,甚至成為系統的瓶頸。

資料庫連線池的基本思想就是為資料庫連線建立乙個「緩衝池」。預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從「緩衝池」中取出乙個,使用完畢之後再放回去。現在很多web伺服器(weblogic, websphere, tomcat)都提供了datasoruce的實現,即連線池的實現

spring事務

宣告式事務有兩種方式,一種是在配置檔案(xml)中做相關的事務規則宣告,另一種是基於@transactional 註解的方式。

@transactional(rollbackfor = exception.class) 就這麼一句話 對應resource資源

@transactional 註解

propagation事務的傳播行為,預設值為 required。

isolation事務的隔離度,預設值採用 default。

timeout 事務的超時時間,預設值為-1。如果超過該時間限制但事務還沒有完成,則自動回滾事務。

read-only 指定事務是否為唯讀事務,預設值為 false;為了忽略那些不需要事務的方法,比如讀取資料,可以設定 read-only 為 true

rollback-for用於指定能夠觸發事務回滾的異常型別,如果有多個異常型別需要指定,各型別之間可以通過逗號分隔。

no-rollback- for 丟擲 no-rollback-for 指定的異常型別,不回滾事務。 

transactiondefinition.propagation_supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。@transactional 只能應用到 public 方法才有效,使用 aspectj 取代 spring aop **。可以解決這個問題。

資料庫的相關經驗總結

sql server select top 10 from testtable where id not in select top 20 id from testtable oracle select from select t.rownum rowid from testtable t wher...

Oracle資料庫優化的經驗總結

個人理解,資料庫效能最關鍵的因素在於io,因為操作記憶體是快速的,但是讀寫磁碟是速度很慢的,優化資料庫最關鍵的問題在於減少磁碟的io,就個 人理解應該分為物理的和邏輯的優化,物理的是指oracle產品本身的一些優化,邏輯優化是指應用程式級別的優化物理優化的一些原則 1 oracle的執行環境 網路,...

C 連線主流資料庫經驗總結

在實際開發中,我們經常需要對資料庫進行訪問,針對不同型別的資料庫 如mysql sqlite access excel等 如果採用不同的方法進行連線,會把我們搞崩潰。如果能夠採用統一的方式對資料庫進行訪問,在開發過程中就會變得方便和簡單。sqlapi 語法很簡單,只要你會c 都能看懂,上手很快。下面...