數據庫:存儲引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三範式等

存儲引擎

概念

數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、

更新和刪除數據。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同

的存儲引擎,還可以 獲得特定的功能。現在許多不同的數據庫管理系統都支持多種不同的數據引

擎。

存儲引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。

InnoDB(B+樹)

InnoDB 底層存儲結構為B+樹, B樹的每個節點對應innodb的一個page,page大小是固定的,

一般設為 16k。其中非葉子節點只有鍵值,葉子節點包含完成數據。


數據庫:存儲引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三範式等

適用場景:

1)經常更新的表,適合處理多重併發的更新請求。

2)支持事務。

3)可以從災難中恢復(通過 bin-log 日誌等)。

4)外鍵約束。只有他支持外鍵。

5)支持自動增加列屬性 auto_increment。

TokuDB(Fractal Tree-節點帶數據)

TokuDB 底層存儲結構為 Fractal Tree,Fractal Tree 的結構與 B+樹有些類似, 在 Fractal Tree

中,每一個 child 指針除了需要指向一個 child 節點外,還會帶有一個 Message Buffer ,這個

Message Buffer 是一個 FIFO 的隊列,用來緩存更新操作。

例如,一次插入操作只需要落在某節點的 Message Buffer 就可以馬上返回了,並不需要搜索到葉

子節點。這些緩存的更新會在查詢時或後臺異步合併應用到對應的節點中。


數據庫:存儲引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三範式等

TokuDB 在線添加索引,不影響讀寫操作, 非常快的寫入性能, Fractal-tree 在事務實現上有優

勢。 他主要適用於訪問頻率不高的數據或歷史數據歸檔。

MyIASM

MyIASM是 MySQL默認的引擎,但是它沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,

因此當 INSERT(插入)或 UPDATE(更新)數據時即寫操作需要鎖定整個表,效率便會低一些。

ISAM 執行讀取操作的速度很快,而且不佔用大量的內存和存儲資源。在設計之初就預想數據組織

成有固定長度的記錄,按順序存儲的。

---ISAM 是一種靜態索引結構,缺點是它不 支持事務處理。

Memory

Memory(也叫 HEAP)堆內存:使用存在內存中的內容來創建表。每個 MEMORY 表只實際對應

一個磁盤文件。MEMORY 類型的表訪問非常得快,因為它的數據是放在內存中的,並且默認使用

HASH 索引。但是一旦服務關閉,表中的數據就會丟失掉。 Memory 同時支持散列索引和 B 樹索

引,B樹索引可以使用部分查詢和通配查詢,也可以使用和>=等操作符方便數據挖掘,散列索

引相等的比較快但是對於範圍的比較慢很多。

索引

索引(Index)是幫助 MySQL 高效獲取數據的數據結構。常見的查詢算法,順序查找,二分查找,二

叉排序樹查找,哈希散列法,分塊查找,平衡多路搜索樹 B 樹(B-tree)

常見索引原則

1.選擇唯一性索引

唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。

2.為經常需要排序、分組和聯合操作的字段建立索引:

3.為常作為查詢條件的字段建立索引。

4.限制索引的數目:

越多的索引,會使更新表變得很浪費時間。

5.儘量使用數據量少的索引

如果索引的值很長,那麼查詢的速度會受到影響。

6.儘量使用前綴來索引

如果索引字段的值很長,最好使用值的前綴來索引。

7.刪除不再使用或者很少使用的索引

8 . 最左前綴匹配原則,非常重要的原則。

9 . 儘量選擇區分度高的列作為索引

10.區分度的公式是表示字段不重複的比例

11 .索引列不能參與計算,保持列“乾淨”:帶函數的查詢不參與索引。

12 .儘量的擴展索引,不要新建索引。

數據庫三範式

範式是具有最小冗餘的表結構。範式具體如下:

第一範式(1st NF -列都是不可再分)

第一範式的目標是確保每列的原子性:如果每列都是不可再分的最小數據單元(也稱為最小的原子

單元),則滿足第一範式(1NF)


數據庫:存儲引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三範式等

第二範式(2nd NF

-每個表只描述一件事情)

首先滿足第一範式,並且表中非主鍵列不存在對主鍵的部分依賴。 第二範式要求每個表只描述一

件事情。

數據庫:存儲引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三範式等

第三範式(3rd NF- 不存在對非主鍵列的傳遞依賴)

第三範式定義是,滿足第二範式,並且表中的列不存在對非主鍵列的傳遞依賴。除了主鍵訂單編

號外,顧客姓名依賴於非主鍵顧客編號。


數據庫:存儲引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三範式等

數據庫是事務

事務(TRANSACTION)是作為單個邏輯工作單元執行的一系列操作,這些操作作為一個整體一起向

系統提交,要麼都執行、要麼都不執行 。事務是一個不可分割的工作邏輯單元

事務必須具備以下四個屬性,簡稱 ACID 屬性:

原子性(Atomicity)

1. 事務是一個完整的操作。事務的各步操作是不可分的(原子的);要麼都執行,要麼都不執

行。

一致性(Consistency)

2. 當事務完成時,數據必須處於一致狀態。隔離性(Isolation)

3. 對數據進行修改的所有併發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方

式依賴於或影響其他事務。

永久性(Durability)

4. 事務完成後,它對數據庫的修改被永久保持,事務日誌能夠保持事務的永久性。

存儲過程(特定功能的 SQL 語句集)

一組為了完成特定功能的 SQL 語句集,存儲在數據庫中,經過第一次編譯後再次調用不需要再次

編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過

程是數據庫中的一個重要對象。

存儲過程優化思路:

1. 儘量利用一些 sql 語句來替代一些小循環,例如聚合函數,求平均函數等。

2. 中間結果存放於臨時表,加索引。

3. 少使用遊標。sql 是個集合語言,對於集合運算具有較高性能。而 cursors 是過程運算。比如

對一個 100 萬行的數據進行查詢。遊標需要讀表 100 萬次,而不使用遊標則只需要少量幾次

讀取。

4. 事務越短越好。sqlserver 支持併發操作。如果事務過多過長,或者隔離級別過高,都會造成

併發操作的阻塞,死鎖。導致查詢極慢,cpu 佔用率極地。

5. 使用 try-catch 處理錯誤異常。

6. 查找語句儘量不要放在循環內。

觸發器(一段能自動執行的程序)

觸發器是一段能自動執行的程序,是一種特殊的存儲過程,觸發器和普通的存儲過程的區別是:

觸發器是當對某一個表進行操作時觸發。諸如:update、insert、delete 這些操作的時候,系統

會自動調用執行該表上對應的觸發器。SQL Server 2005 中觸發器可以分為兩類:DML 觸發器和

DDL 觸發器,其中 DDL 觸發器它們會影響多種數據定義語言語句而激發,這些語句有 create、

alter、drop 語句。

數據庫併發策略

併發控制一般採用三種方法,分別是樂觀鎖和悲觀鎖以及時間戳。

樂觀鎖

樂觀鎖認為一個用戶讀數據的時候,別人不會去寫自己所讀的數據;悲觀鎖就剛好相反,覺得自

己讀數據庫的時候,別人可能剛好在寫自己剛讀的數據,其實就是持一種比較保守的態度;時間

戳就是不加鎖,通過時間戳來控制併發出現的問題。

悲觀鎖

悲觀鎖就是在讀取數據的時候,為了不讓別人修改自己讀取的數據,就會先對自己讀取的數據加

鎖,只有自己把數據讀完了,才允許別人修改那部分數據,或者反過來說,就是自己修改某條數

據的時候,不允許別人讀取該數據,只有等自己的整個事務提交了,才釋放自己加上的鎖,才允

許其他用戶訪問那部分數據。

時間戳

時間戳就是在數據庫表中單獨加一列時間戳,比如“TimeStamp”,每次讀出來的時候,把該字

段也讀出來,當寫回去的時候,把該字段加1,提交之前 ,跟數據庫的該字段比較一次,如果比數

據庫的值大的話,就允許保存,否則不允許保存,這種處理方法雖然不使用數據庫系統提供的鎖

機制,但是這種方法可以大大提高數據庫處理的併發量,

以上悲觀鎖所說的加“鎖”,其實分為幾種鎖,分別是:排它鎖(寫鎖)和共享鎖(讀鎖)。

數據庫鎖

行級鎖

行級鎖是一種排他鎖,防止其他事務修改此行;在使用以下語句時,Oracle 會自動應用行級鎖:

1. INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];

2. SELECT … FOR UPDATE 語句允許用戶一次鎖定多條記錄進行更新

3. 使用 COMMIT 或 ROLLBACK 語句釋放鎖。

表級鎖

表示對當前操作的整張表加鎖,它實現簡單,資源消耗較少,被大部分 MySQL 引擎支持。最常使

用的 MYISAM 與 INNODB 都支持表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨佔寫鎖

(排他鎖)。

頁級鎖

頁級鎖是 MySQL 中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但衝突多,行級

衝突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。BDB 支持頁級鎖

未完待續…………

整理不易,需要完整pdf文檔的小夥伴可以後臺私信“資料”獲取哦~


分享到:


相關文章: