數據庫基礎總結

1 數據庫基礎

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

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

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

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

(1)模式程序員

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

理解:算法

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

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

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

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

(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.NAMES.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. 索引做用

爲何要建立索引呢?這是由於,建立索引能夠大大提升系統的性能。

  • 第一,經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性。
  • 第二,能夠大大加快 數據的檢索速度,這也是建立索引的最主要的緣由。
  • 第三,能夠加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義。
  • 第四,在使用分組和排序 子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間。
  • 第五,經過使用索引,能夠在查詢的過程當中,使用優化隱藏器,提升系統的性能。

也許會有人要問:增長索引有如此多的優勢,爲何不對錶中的每個列建立一個索引呢?這種想法當然有其合理性,然而也有其片面性。雖然,索引有許多優勢, 可是,爲表中的每個列都增長索引,是很是不明智的。這是由於,增長索引也有許多不利的一個方面。

  • 第一,建立索引和維護索引要耗費時間,這種時間隨着數據 量的增長而增長。
  • 第二,索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。
  • 第三,當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。

具體請看:

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 支持的表類型不止上面幾種。

具體請看:

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 ( column1column2column3 )

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 後,在內存中進行分配 優點:簡單高效 缺點:沒法保證自增順序

具體請看:

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

具體請看:

6. 寫 SQL 語句和 SQL 優化

具體請看:

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

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

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

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

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

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

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

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

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

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

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

當前主流的關係型數據庫有 Oracle、DB二、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 的對比:

 
相關文章
相關標籤/搜索