面試之數據庫篇

本篇是我總結的面試中常見的數據庫的知識點,可能會有疏漏或者我自己理解不到位的地方,歡迎留言指正。

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

存儲過程的特點:有輸入輸出參數,可以聲明變量,可使用if/else,case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;模塊化,封裝,代碼複用,速度快,只有首次執行需要經過編譯和優化步驟,後續從調用可以直接執行。

存儲過程的優點:

1,增強SQL語言的功能和靈活性;

2,標準組件式編程;

3,較快的執行速度;

4,可作爲一種安全機制。

缺點:不同數據庫,語法差別很大,移植困難,換了數據庫,需要重新編寫;

不好管理,把過多業務邏輯寫在存儲過程不好維護,不利於分層管理,容易混亂,一般存儲過程適用於個別對性能要求較高的業務

 

事務:事務是指由一系列數據庫操作組成的一個完整的邏輯過程,這個過程中的所有操作要麼都成功,要麼都不成功。

事務的特性:ACID是事務的四個特性。

  1. 原子性(atomicity): 指所有在事務中的操作要麼都成功,要麼都不成功,所有的操作都不可分割,沒有中間狀態。一旦某一步執行失敗,就會全部回滾到初始狀態。
  2. 一致性(consistency): 指的是邏輯上的一致性,即事務完成前後,數據在也無意義上都是正確的。
  3. 隔離性(isolation): 即不同事務之間的相互影響和隔離的程度。比如,不同的隔離級別,事務的併發程度也不同,最強的隔離狀態是所有的事務都是串行化的(serializable)(即一個事務完成之後才能進行下一個事務),這樣併發性也會降到最低,在保證了強一致性的情況下,性能也會受很大影響,所以在實際工程當中,往往會折中一下。
  4. 持久性(durability): 可以簡單地理解爲事務執行完畢後數據不可逆並持久化存儲於存儲系統當中

事務的隔離級別:

① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。

   ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

   ③ Read committed (讀已提交):可避免髒讀的發生。

   ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

髒讀:指一個事務讀到了另一個事務中未提交的數據。

不可重複讀:針對一條記錄的,同一條記錄前後不一樣

虛讀(幻讀):針對一張表,前後讀到的記錄條數不一樣。

 

索引:是存儲引擎用於快速找到記錄的一種數據結構,所有索引相當於目錄表,本質都是通過不斷縮小查找數據的範圍來快速獲取數據。

索引的兩大類型:hash和BTree

hash類型的索引:查詢單條快,範圍查詢慢

BTree類型的索引:查詢和樹的層數有關,層數增加,數據量指數級增長

不同的存儲引擎支持的索引類型也不一樣 InnoDB 支持事務,支持行級別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; Memory 不支持事務,支持表級別鎖定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;

磁盤IO與預讀:當一次IO時,不光吧當前磁盤地址的數據,而是把相鄰的數據也讀取到內存緩衝區內。因爲計算機訪問一個地址的數據的時候,通常馬上會訪問到相鄰位置的數據。一次IO讀取的數據稱爲一頁。

索引的數據結構的要求:每次查找數據時把磁盤IO次數控制在一個很小的數量級。

索引的分類:

單值索引:一個索引值包含單個列,一個表可以包含多個單值索引。

複合索引:一個索引包含多個列。

1,普通索引index:加速查找

2,唯一索引:

主鍵索引primary key:加速查找+約束(不爲空且唯一)

唯一索引unique:加速查找+約束(唯一,允許有空值)

3,聯合索引

primary key(col1,col2):聯合主鍵索引

unique(col1,col2):聯合唯一索引

index(col1,col2):聯合普通索引

4,全文索引fulltext:fulltext索引僅可用於MyISAM表,用於搜索很長的文檔時,效果最好。

索引的缺點:索引會佔用磁盤空間,如果在一個大表上建立了多種複合索引,索引文件會膨脹的很快。過多的使用索引,降低更新表數據的速度,如對錶進行insert,update,delete。因爲更新表時,MySQL不僅要保存數據,還要保存一下索引文件。

優點:

1.大大加快數據的檢索速度;

2.創建唯一性索引,保證數據庫表中每一行數據的唯一性;

3.加速表和表之間的連接;

4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

鎖是網絡數據庫中的一個非常重要的概念,當多個用戶同時對數據庫併發操作時,會帶來數據不一致的問題,所以,鎖主要用於多用戶環境下保證數據庫完整性和一致性。

鎖分類:從數據庫系統角度分爲三種:排他鎖、共享鎖、更新鎖。 

共享鎖:(Share Lock)S鎖,也叫讀鎖,用於所有的只讀數據操作。共享鎖是非獨佔的,允許多個併發事務讀取其鎖定的資源。 

性質 :

1. 多個事務可封鎖同一個共享頁; 

2. 任何事務都不能修改該頁; 

3. 通常是該頁被讀取完畢,S鎖立即被釋放。

排他鎖(Exclusive Lock)X鎖,也叫寫鎖,表示對數據進行寫操作。如果一個事務對對象加了排他鎖,其他事務就不能再給它加任何鎖了。

性質:

1. 僅允許一個事務封鎖此頁;

2. 其他任何事務必須等到X鎖被釋放才能對該頁進行訪問;

3. X鎖一直到事務結束才能被釋放。

更新鎖:U鎖,在修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現象。

性質 :

1. 用來預定要對此頁施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖; 

2. 當被讀取的頁要被更新時,則升級爲X鎖; 

3. U鎖一直到事務結束時才能被釋放。

鎖的粒度就是指鎖的生效範圍,就是說是行鎖,還是頁鎖,還是整表鎖. 鎖的粒度同樣既可以由數據庫自動管理,也可以通過手工指定hint來管理。

行鎖:鎖的作用範圍是行級別。

表鎖:鎖的作用範圍是整張表。

數據庫能夠確定那些行需要鎖的情況下使用行鎖,如果不知道會影響哪些行的時候就會使用表鎖。

死鎖:T1封鎖了數據R1,正請求對R2封鎖,而T2封住了R2,正請求封鎖R1,這樣就會導致死鎖,死鎖這種沒有完全解決的方法,只能儘量預防。 解決:調整程序的邏輯,對數據庫的多表進行操作時,儘量按照相同的順序。

避免死鎖:

1)以固定的順序訪問表和行。即按順序申請鎖,這樣就不會造成互相等待的場面。

2)大事務拆小。大事務更傾向於死鎖,如果業務允許,將大事務拆小。

3)在同一個事務中,儘可能做到一次鎖定所需要的所有資源,減少死鎖概率。

4)降低隔離級別。如果業務允許,將隔離級別調低也是較好的選擇,比如將隔離級別從RR調整爲RC,可以避免掉很多因爲gap鎖造成的死鎖。

5)爲表添加合理的索引。如果不走索引將會爲表的每一行記錄添加上鎖,死鎖的概率大大增大。

 

關係型數據庫和非關係型數據庫:

關係型數據庫:指採用了關係模型來組織數據的數據庫。

關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。

非關係型數據庫:指非關係型的,分佈式的,且一般不保證遵循ACID原則的數據存儲系統。

非關係型數據庫結構

非關係型數據庫以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,不侷限於固定的結構,可以減少一些時間和空間的開銷。

數據庫

關係型數據庫(SQLite,Oracle,mysql)

非關係型數據庫(mongoDB,redis,HBbase)

特性

1、關係型數據庫,是指採用了關係模型來組織

數據的數據庫;

2、關係型數據庫的最大特點就是事務的一致性;

3、簡單來說,關係模型指的就是二維表格模型,

而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。

1、使用鍵值對存儲數據;

2、分佈式;

3、一般不支持ACID特性;

4、非關係型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。

優點

1、容易理解:二維表結構是非常貼近邏輯世界一個概念,關係模型相對網狀、層次等其他模型來說更容易理解;

2、使用方便:通用的SQL語言使得操作關係型數據庫非常方便;

3、易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗餘和數據不一致的概率;

4、支持SQL,可用於複雜的查詢。

1、無需經過sql層的解析,讀寫性能很高;

2、基於鍵值對,數據沒有耦合性,容易擴展;

3、存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,而關係型數據庫則只支持基礎類型。

缺點

1、爲了維護一致性所付出的巨大代價就是其讀寫性能比較差;

2、固定的表結構,靈活度稍欠;

3、高併發讀寫需求,傳統關係型數據庫來說,硬盤I/O是一個很大的瓶頸。

1、不提供sql支持,學習和使用成本較高;

2、無事務處理;

3,只適合存儲一些較爲簡單的數據,對於需要進行較複雜查詢的數據,關係型數據庫顯的更爲合適。

4,不適合持久存儲海量數據

 

CAP理論:一個分佈式系統不可能同時滿足C(一致性)、A(可用性)、P(分區容錯性)三個基本需求,並且最多隻能滿足其中的兩項。對於一個分佈式系統來說,分區容錯是基本需求,否則不能稱之爲分佈式系統,因此需要在C和A之間尋求平衡

C(Consistency)一致性

一致性是指更新操作成功並返回客戶端完成後,所有節點在同一時間的數據完全一致。與ACID的C完全不同

A(Availability)可用性

可用性是指服務一直可用,而且是正常響應時間。

P(Partition tolerance)分區容錯性

分區容錯性是指分佈式系統在遇到某節點或網絡分區故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。

 

完整性約束:

數據完整性:存儲在數據庫中的所有數據值均正確的狀態。它是應防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。

 

數據完整性分爲四類:

1. 實體完整性(實體完整性是對關係中的記錄唯一性,也就是主鍵的約束。準確地說,實體完整性是指關係中的主屬性值不能爲Null且不能有相同值。定義表中的所有行能唯一的標識,一般用主鍵,唯一索引 unique關鍵字,及identity屬性比如說我們的身份證號碼,可以唯一標識一個人.。)

2. 域完整性(域完整性是對數據表中字段屬性的約束,通常指數據的有效性,它包括字段的值域、字段的類型及字段的有效規則等約束,它是由確定關係結構時所定義的字段的屬性決定的。限制數據類型,缺省值,規則,約束,是否可以爲空,域完整性可以確保不會輸入無效的值.。)

3. 參照完整性(參照完整性是對關係數據庫中建立關聯關係的數據表間數據參照引用的約束,也就是對外鍵的約束。準確地說,參照完整性是指關係中的外鍵必須是另一個關係的主鍵有效值,或者是NULL。參考完整性維護表間數據的有效性,完整性,通常通過建立外部鍵聯繫另一表的主鍵實現,還可以用觸發器來維護參考照整性)

4. 用戶定義的完整性。

 

約束是表級的強制規定,有以下五中:not null(非空約束),unique(唯一約束),primary key(主鍵約束),foreign key(外鍵約束),check (檢查約束)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章