1. 程式人生 > >數據庫基礎總結

數據庫基礎總結

沖突 防止 ip) 硬盤 一定的 長度 clas uid noop

1 數據庫基礎

1. 數據抽象:物理抽象、概念抽象、視圖級抽象,內模式、模式、外模式

數據庫系統三級抽象是指:

  • 視圖級抽象:把現實世界抽象為數據庫的外模式; 把現實世界中的信息按照不同用戶的觀點抽象為多個邏輯數據結構,每個邏輯結構稱為一個視圖,描述了每個用戶關心的數據,即數據庫的一個側面。所有視圖的集合形成了數據庫的外模式。
  • 概念級抽象:把數據庫外模式抽象為數據庫的概念模式。將外模式所有視圖綜合為數據庫整體邏輯結構,這就是數據庫概念模式,即全體用戶關心的現實抽象。
  • 物理級抽象:把數據庫概念模式抽象為數據庫的內模式。

三種數據庫模式:外模式、概念模式和內模式:

(1)模式

定義:也稱邏輯模式,是數據庫中全體數據的邏輯結構和特征的描述,是所有用戶的公共數據視圖。

理解:

① 一個數據庫只有一個模式;

② 是數據庫數據在邏輯級上的視圖;

③ 數據庫模式以某一種數據模型為基礎;

④ 定義模式時不僅要定義數據的邏輯結構 (如數據記錄由哪些數據項構成,數據項的名字、類型、取值範圍等),而且要定義與數據有關的安全性、完整性要求,定義這些數據之間的聯系。

(2)外模式 (External Schema)

定義:也稱子模式 (Subschema) 或用戶模式,是數據庫用戶 (包括應用程序員和最終用戶) 能夠看見和使用的局部數據的邏輯結構和特征的描述,是數據庫用戶的數據視圖,是與某一應用有關的數據的邏輯表示。

理解:

① 一個數據庫可以有多個外模式;

② 外模式就是用戶視圖;

③ 外模式是保證數據安全性的一個有力措施。

(3)內模式 (Internal Schema)

定義:也稱存儲模式 (Storage Schema),它是數據物理結構和存儲方式的描述,是數據在數據庫內部的表示方式 (例如,記錄的存儲方式是順序存儲、按照 B 樹結構存儲還是按 hash 方法存儲; 索引按照什麽方式組織; 數據是否壓縮存儲,是否加密; 數據的存儲記錄結構有何規定)。

理解:

① 一個數據庫只有一個內模式;

② 一個表可能由多個文件組成,如:數據文件、索引文件。

它是數據庫管理系統 (DBMS) 對數據庫中數據進行有效組織和管理的方法

其目的有:

① 為了減少數據冗余,實現數據共享;

② 為了提高存取效率,改善性能。

具體請看:http://www.2cto.com/database/201412/360263.html

2. SQL 語言包括數據定義、數據操縱 (Data Manipulation),數據控制 (Data Control)

  • 數據定義:Create Table, Alter Table, Drop Table, Craete/Drop Index 等
  • 數據操縱:Select, insert, update, delete
  • 數據控制:grant, revoke

3. SQL 常用命令:

CREATE TABLE Student(

ID NUMBER PRIMARY KEY,

NAME VARCHAR2(50) NOT NULL);// 建表

CREATE VIEW view_name AS

Select * FROM Table_name;// 建視圖

Create UNIQUE INDEX index_name ON TableName(col_name);// 建索引

INSERT INTO tablename {column1,column2,…} values(exp1,exp2,…);// 插入

INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);// 插入視圖實際影響表

UPDATE tablename SET name=’zang 3’ condition;// 更新數據

DELETE FROM Tablename WHERE condition;// 刪除

GRANT (Select,delete,…) ON (對象) TO USER_NAME [WITH GRANT OPTION];// 授權

REVOKE (權限表) ON(對象) FROM USER_NAME [WITH REVOKE OPTION] // 撤權

列出工作人員及其領導的名字:

Select E.NAME, S.NAME FROM EMPLOYEE E S

WHERE E.SUPERName=S.Name

4. 視圖

視圖(View)是從一個或多個表(或視圖)導出的表。視圖與表(有時為與視圖區別,也稱表為基本表——Base Table)不同,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,數據庫中只存儲視圖的定義,在對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表。

數據庫存儲數據是通過表來實現的,其有物理存儲空間,也是你數據真正存儲的地方。可以通過對表的操作來實現你對數據的操作。

視圖其實是物理不存在的,其是通過數據庫代碼來將一些表中的數據進行一個想要的邏輯結構重新進行整理。可能這樣說有點更迷糊。

視圖沒有新建表,只是把原來表中的數據成員通過數據庫語言按照我們需要的邏輯結構重新組織,而進行操作的時候跟一個表是一樣的。

具體請看:http://www.w3school.com.cn/sql/sql_view.asp

5. 完整性約束:實體完整性、參照完整性、用戶定義完整性

關系模型中可以有三類完整性約束:實體完整性、參照完整性和用戶定義的完整性。實體完整性規則定義了對關系中主屬性(主鍵)取值的約束,即對主屬性的值域的約束;而參照完整性規則定義了參照關系和被參照關系的外碼與主碼之間的參照約束,即對參照關系的外碼屬性值域的約束,規定外碼屬性的值域只能是空值或是相應被參照關系主碼屬性的值。用戶定義完整性就是針對某一具體的關系數據庫的約束條件,反映某一具體應用所涉及的數據必須滿足的語義要求,由應用的環境決定。例如,銀行的用戶帳戶規定必須大於等於 100000,小於 999999。所以,用戶定義的完整性通常是定義對關系中除主鍵與外鍵屬性之外的其他屬性取值的約束,即對其他屬性的值域的約束。

實體完整性約束規則是指:若屬性(指一個或一組屬性)A 是基本關系 R 的主屬性,則 A 不能取空值。所謂空值就是 “不知道” 或“不存在”的值。

實體完整性規則說明如下:

  • (1)實體完整性規則是針對基本關系而言的。一個基本表通常對應現實世界的一個實體集。
  • (2)現實世界中的實體是可區分的,即它們具有某種唯一的標識。
  • (3)相應地,關系模型中以主碼作為唯一性標識。
  • (4)主碼中的屬性即主屬性不能取空值。如果主屬性取空值,就說明存在某個不可標識的實體,即存在不可區分的實體,這與(2)點相矛盾,因此這個規則稱為實體完整性。

用戶自定義完整性約束:

不同的關系數據庫系統根據其應用環境的不同,往往還需要一些特殊的約束條件。用戶自定義的完整性就是針對某一具體關系數據庫的約束條件。它反映某一具體應用所涉及的數據必須滿足的語義要求。

6. 第三範式

  • 1NF: 每個屬性是不可分的。強調的是列的原子性,即列不能夠再分成其他幾列。
  • 2NF: 若關系 R 是1NF, 且每個非主屬性都完全函數依賴於 R 的鍵。例 SLC(SID#, CourceID#, SNAME,Grade), 則不是 2NF; 首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。
  • 3NF: 若 R 是 2NF,且它的任何非鍵屬性都不傳遞依賴於任何候選鍵。首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。

7. ER(實體 / 聯系) 模型

  • 定義:ER 模型又稱實體聯系模型(Entity-Relationship). 是設計數據庫的一個重要分析模型。
  • 實體:是一個數據集對象,或數據集(上篇博客數據結構導論裏有介紹)。應用中可以區別的客觀存在的事物。實體可以是一個人、文件、課程,它是具有自己屬性、一組有意義的數據組成的一個集合體。
  • 聯系:實體不是孤立的,實體之間是有聯系的。例如學生和課程之間具有交叉屬性,即分數;A 實體和 B 實體之間交互產生的數據就是它們的屬性。

8. 索引作用

為什麽要創建索引呢?這是因為,創建索引可以大大提高系統的性能。

  • 第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
  • 第二,可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。
  • 第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
  • 第四,在使用分組和排序 子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
  • 第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

也許會有人要問:增加索引有如此多的優點,為什麽不對表中的每一個列創建一個索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優點, 但是,為表中的每一個列都增加索引,是非常不明智的。這是因為,增加索引也有許多不利的一個方面。

  • 第一,創建索引和維護索引要耗費時間,這種時間隨著數據 量的增加而增加。
  • 第二,索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那麽需要的空間就會更大。
  • 第三,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

具體請看:

  • http://blog.csdn.net/pang040328/article/details/4164874
  • http://www.cnblogs.com/huangye-dream/archive/2013/03/13/2957049.html

9. 事務

事務是一系列的數據庫操作,是數據庫應用的基本邏輯單位。 事務(Transaction)是並發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要麽都執行,要麽都不執行,它是一個不可分割的工作單位。

  • ①原子性 (Atomicity):事務中的所有元素作為一個整體提交或回滾,事務的個元素是不可分的,事務是一個完整操作。
  • ②一致性 (Consistemcy):事物完成時,數據必須是一致的,也就是說,和事物開始之前,數據存儲中的數據處於一致狀態。保證數據的無損。
  • ③隔離性 (Isolation):對數據進行修改的多個事務是彼此隔離的。這表明事務必須是獨立的,不應該以任何方式以來於或影響其他事務。
  • ④持久性 (Durability):事務完成之後,它對於系統的影響是永久的,該修改即使出現系統故障也將一直保留,真實的修改了數據庫

10. 鎖:共享鎖、互斥鎖

  • 共享鎖(S 鎖):如果事務 T 對數據 A 加上共享鎖後,則其他事務只能對 A 再加共享鎖,不能加排他鎖,直到已釋放所有共享鎖。獲準共享鎖的事務只能讀數據,不能修改數據。
  • 排他鎖(X 鎖):如果事務 T 對數據 A 加上排他鎖後,則其他事務不能再對 A 加任任何類型的鎖,直到在事務的末尾將資源上的鎖釋放為止。獲準排他鎖的事務既能讀數據,又能修改數據。

兩段鎖協議:階段1:加鎖階段 階段2:解鎖階段

具體請看:http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html

11. 死鎖及處理:事務循環等待數據鎖,則會死鎖。

  • ①死鎖預防利用死鎖預防協議,通過破壞死鎖產生的必要條件來避免系統進入死鎖狀態,防止死鎖發生。
  • ②死鎖檢測與恢復則是允許系統進入死鎖狀態,並且定期檢查系統是否發生死鎖。當發現系統發生死鎖後,采取相應的恢復機制使系統擺脫死鎖狀態。

12. 存儲過程:存儲過程就是編譯好了的一些 sql 語句。

存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的 SQL 語句集,存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象。

存儲過程與函數的區別:

  • 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。
  • 對於存儲過程來說可以返回參數 (output),而函數只能返回值或者表對象。
  • 存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於 FROM 關鍵字的後面。

存儲過程的優點:

  • 存儲過程的能力大大增強了 SQL 語言的功能和靈活性。
  • 可保證數據的安全性和完整性。
  • 通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。
  • 通過存儲過程可以使相關的動作在一起發生,從而可以維護數據庫的完整性。
  • 在運行存儲過程前,數據庫已對其進行了語法和句法分析,並給出了優化執行方案。這種已經編譯好的過程可極大地改善 SQL 語句的性能。即存儲過程在被編譯後會被直接保存在數據庫中,成為數據庫的一部分,以後就可以反復調用,運行速度快,效率高
  • 可以降低網絡的通信量。存儲過程主要是在服務器上運行,減少對客戶機的壓力。
  • 使體現企業規則的運算程序放入數據庫服務器中,以便 集中控制。
  • 存儲過程可以分為系統存儲過程、擴展存儲過程和用戶自定義的存儲過程
  • 可保證數據的安全性和完整性。通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。通過存儲過程可以使相關的動作在一起發生,從而可以維護數據庫的完整性。
  • 存儲過程可以接受參數、輸出參數、返回單個或多個結果集以及返回值。可以向程序返回錯誤原因 * 存儲過程可以包含程序流、邏輯以及對數據庫的查詢。同時可以實體封裝和隱藏了數據邏輯。

13. 觸發器: 當滿足觸發器條件,則系統自動執行觸發器的觸發體。

觸發時間:有 before,after。觸發事件:有 insert,update,delete 三種。觸發類型:有行觸發、語句觸發

14. 內聯接,外聯接區別?

內連接是保證兩個表中所有的行都要滿足連接條件,而外連接則不然。

在外連接中,某些不滿條件的列也會顯示出來,也就是說,只限制其中一個表的行,而不限制另一個表的行。分左連接、右連接、全連接三種

15. 存儲過程和函數的區別

存儲過程是用戶定義的一系列 sql 語句的集合,涉及特定表或其它對象的任務,用戶可以調用存儲過程,而函數通常是數據庫已定義的方法,它接收參數並返回某種類型的值並且不涉及特定用戶表。

16. 事務是什麽?

事務是作為一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱為 ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成為一個事務:
原子性事務必須是原子工作單元;對於其數據修改,要麽全都執行,要麽全都不執行。
一致性事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。
隔離性由並發事務所作的修改必須與任何其它並發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麽是另一並發事務修改它之前的狀態,要麽是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱為可串行性,因為它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
持久性事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。

17. 遊標的作用?如何知道遊標已經到了最後?

遊標用於定位結果集的行,通過判斷全局變量 @@FETCH_STATUS 可以判斷是否到了最後,通常此變量不等於 0 表示出錯或到了最後。

18. 觸發器分為事前觸發和事後觸發,這兩種觸發有和區別。語句級觸發和行級觸發有何區別。

事前觸發器運行於觸發事件發生之前,而事後觸發器運行於觸發事件發生之後。通常事前觸發器可以獲取事件之前和新的字段值。
語句級觸發器可以在語句執行前或後執行,而行級觸發在觸發器所影響的每一行觸發一次。

2 數據庫 MySql

1. MySql 的存儲引擎的不同

MySQL 中的數據用各種不同的技術存儲在文件 (或者內存) 中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

  • MyISAM:這種引擎是 mysql 最早提供的。這種引擎又可以分為靜態 MyISAM、動態 MyISAM 和壓縮 MyISAM 三種:
    • 靜態 MyISAM:如果數據表中的各數據列的長度都是預先固定好的,服務器將自動選擇這種表類型。因為數據表中每一條記錄所占用的空間都是一樣的,所以這種表存取和更新的效率非常高。當數據受損時,恢復工作也比較容易做。
    • 動態 MyISAM:如果數據表中出現 varchar、xxxtext 或 xxxBLOB 字段時,服務器將自動選擇這種表類型。相對於靜態 MyISAM,這種表存儲空間比較小,但由於每條記錄的長度不一,所以多次修改數據後,數據表中的數據就可能離散的存儲在內存中,進而導致執行效率下降。同時,內存中也可能會出現很多碎片。因此,這種類型的表要經常用 optimize table 命令或優化工具來進行碎片整理。
    • 壓縮 MyISAM:以上說到的兩種類型的表都可以用 myisamchk 工具壓縮。這種類型的表進一步減小了占用的存儲,但是這種表壓縮之後不能再被修改。另外,因為是壓縮數據,所以這種表在讀取的時候要先時行解壓縮。
      但是,不管是何種 MyISAM 表,目前它都不支持事務,行級鎖和外鍵約束的功能。
  • MyISAM Merge 引擎:這種類型是 MyISAM 類型的一種變種。合並表是將幾個相同的 MyISAM 表合並為一個虛表。常應用於日誌和數據倉庫。
  • InnoDB:InnoDB 表類型可以看作是對 MyISAM 的進一步更新產品,它提供了事務、行級鎖機制和外鍵約束的功能。
  • memory(heap):這種類型的數據表只存在於內存中。它使用散列索引,所以數據的存取速度非常快。因為是存在於內存中,所以這種類型常應用於臨時表中。
  • archive:這種類型只支持 select 和 insert 語句,而且不支持索引。常應用於日誌記錄和聚合分析方面。

當然 MySql 支持的表類型不止上面幾種。

具體請看:

  • http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html
  • http://blog.csdn.net/zhangyuan19880606/article/details/51217952

2. 單個索引、聯合索引、主鍵索引

索引是一種特殊的文件 (InnoDB 數據表上的索引是表空間的一個組成部分),它們包含著對數據表裏所有記錄的引用指針。普通索引(由關鍵字 KEY 或 INDEX 定義的索引) 的唯一任務是加快對數據的訪問速度。

Mysql 常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引

  • PRIMARY KEY(主鍵索引) ALTER TABLE table_name ADD PRIMARY KEY ( column )
  • UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE (column)
  • INDEX(普通索引) ALTER TABLE table_name ADD INDEX index_name ( column )
  • FULLTEXT(全文索引) ALTER TABLE table_name ADD FULLTEXT ( column )
  • 組合索引 ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

Mysql 各種索引區別:

  • 普通索引:最基本的索引,沒有任何限制
  • 唯一索引:與 "普通索引" 類似,不同的就是:索引列的值必須唯一,但允許有空值。
  • 主鍵索引:它 是一種特殊的唯一索引,不允許有空值。
  • 全文索引:僅可用於 MyISAM 表,針對較大的數據,生成全文索引很耗時好空間。
  • 組合索引:為了更多的提高 mysql 效率可建立組合索引,遵循” 最左前綴 “原則。

3. Mysql 怎麽分表,以及分表後如果想按條件分頁查詢怎麽辦

當一張的數據達到幾百萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在於此,減小數據庫的負擔,縮短查詢時間。

如何分表?

  • 做 mysql 集群,例如:利用 mysql cluster ,mysql proxy,mysql replication,drdb 等等
  • 預先估計會出現大數據量並且訪問頻繁的表,將其分為若幹個表
  • 利用 merge 存儲引擎來實現分表

分表後如果想按條件分頁查詢怎麽辦?

  1. 如果只是為了分頁,可以考慮這種分表,就是表的 id 是範圍性的,且 id 是連續的,比如第一張表 id 是 1 到 10 萬,第二張是 10 萬到 20 萬,這樣分頁應該沒什麽問題。
  2. 如果是其他的分表方式,建議用 sphinx 先建索引,然後查詢分頁
  3. 有損服務,只給他查一年內的數據,或者只存 1kw 條數據。建一個表存一年內的數據,每隔一個月把表最舊的數據遷到分表上面。如果需求方要查所有數據,讓他自己選年份去查。

具體請看:http://blog.51yip.com/mysql/949.html

4. 分表之後想讓一個 id 多個表是自增的,效率實現

多個表之間的主鍵不能用數據庫本身的自增主鍵來支持,因為不同表之間生成的主鍵會重復。所以需要其他的方式獲取主鍵 ID。

(1)通過 MySQL 表生成 ID

在《關於 MySQL 分表操作的研究》提到了一種方法:
對於插入也就是 insert 操作,首先就是獲取唯一的 id 了,就需要一個表來專門創建 id,插入一條記錄,並獲取最後插入的 ID。

這種方法效果很好,但是在高並發情況下,MySQL 的 AUTO_INCREMENT 將導致整個數據庫慢。如果存在自增字段,MySQL 會維護一個自增鎖,innodb 會在內存裏保存一個計數器來記錄 auto_increment 值,當插入一個新行數據時,就會用一個表鎖來鎖住這個計數器,直到插入結束。

(2)通過 redis 生成 ID

(3)隊列方式

使用隊列服務,如 redis、memcacheq 等等,將一定量的 ID 預分配在一個隊列裏,每次插入操作,先從隊列中獲取一個 ID,若插入失敗的話,將該 ID 再次添加到隊列中,同時監控隊列數量,當小於閥值時,自動向隊列中添加元素。
這種方式可以有規劃的對 ID 進行分配,還會帶來經濟效應,比如 QQ 號碼,各種靚號,明碼標價。如網站的 userid, 允許 uid 登陸,推出各種靚號,明碼標價,對於普通的 ID 打亂後再隨機分配。

(5)oracle sequence : 基於第三方 oracle 的 SEQ.NEXTVAL 來獲取一個 ID 優勢:簡單可用 缺點:需要依賴第三方 oracle 數據庫

(6)mysql id 區間隔離 : 不同分庫設置不同的起始值和步長,比如 2 臺 mysql,就可以設置一臺只生成奇數,另一臺生成偶數. 或者 1 臺用 0~10 億,另一臺用 10~20 億. 優勢:利用 mysql 自增 id 缺點:運維成本比較高,數據擴容時需要重新設置步長。

(7)基於數據庫更新+內存分配: 在數據庫中維護一個 ID,獲取下一個 ID 時,會對數據庫進行 ID=ID+100 WHERE ID=XX,拿到 100 個 ID 後,在內存中進行分配 優勢:簡單高效 缺點:無法保證自增順序

具體請看:

  • http://www.ttlsa.com/mysql/mysql-table-to-solve-the-increment-id-scheme/
  • http://blog.csdn.net/u010256841/article/details/56840743

5. MySql 的主從實時備份同步的配置,以及原理 (從庫讀主庫的 binlog),讀寫分離。

具體請看:

  • http://www.cnblogs.com/kyrin/p/5967619.html
  • http://blog.csdn.net/jobjava/article/details/41420417

6. 寫 SQL 語句和 SQL 優化

具體請看:

  • sql 語句的優化分析
  • 優化 SQL 查詢:如何寫出高性能 SQL 語句

7. 索引的數據結構,B + 樹

具體請看:MySQL 索引背後的數據結構及算法原理

8. 數據庫的鎖:行鎖,表鎖;樂觀鎖,悲觀鎖

模式行鎖表鎖頁鎖
MyISAM
BDB
InnoDB
  • 表鎖: 開銷小,加鎖快;不會出現死鎖;鎖定力度大,發生鎖沖突概率高,並發度最低
  • 行鎖: 開銷大,加鎖慢;會出現死鎖;鎖定粒度小,發生鎖沖突的概率低,並發度高
  • 頁鎖: 開銷和加鎖速度介於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,並發度一般

表鎖更適用於以查詢為主,只有少量按索引條件更新數據的應用;行鎖更適用於有大量按索引條件並發更新少量不同數據,同時又有並發查詢的應用。

具體請看:數據庫鎖:樂觀鎖和悲觀鎖,共享鎖和排它鎖,行級鎖和表級鎖

9. 數據庫事務的幾種粒度

數據庫訪問控制的粒度可分為 4 個層次, 分別是數據庫級、表級、記錄級 (行級) 和屬性級(字段級)

具體請看:數據庫事務的四大特性

10. 關系型和非關系型數據庫區別

關系型數據庫通過外鍵關聯來建立表與表之間的關系,非關系型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關系通過每個對象自身的屬性來決定。

當前主流的關系型數據庫有 Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL 等。

非關系型數據庫有 NoSql、Cloudant。

nosql 和關系型數據庫比較?

優點:

  • 1)成本:nosql 數據庫簡單易部署,基本都是開源軟件,不需要像使用 oracle 那樣花費大量成本購買使用,相比關系型數據庫價格便宜。
  • 2)查詢速度:nosql 數據庫將數據存儲於緩存之中,關系型數據庫將數據存儲在硬盤中,自然查詢速度遠不及 nosql 數據庫。
  • 3)存儲數據的格式:nosql 的存儲格式是 key,value 形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而數據庫則只支持基礎類型。
  • 4)擴展性:關系型數據庫有類似 join 這樣的多表查詢機制的限制導致擴展很艱難。

缺點:

  • 1)維護的工具和資料有限,因為 nosql 是屬於新的技術,不能和關系型數據庫 10 幾年的技術同日而語。
  • 2)不提供對 sql 的支持,如果不支持 sql 這樣的工業標準,將產生一定用戶的學習和使用成本。
  • 3)不提供關系型數據庫對事物的處理。

比如 mysql 與 mongodb 的對比:

技術分享圖片 技術分享圖片

數據庫基礎總結