C++常見面試問題彙總5——數據庫

  • 關係型和非關係型數據庫的區別(各自優點)

類型 特性 優點 缺點

 

 

 

 

關係型數據庫

SQLite、Oracle、mysql

 

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

2、關係型數據庫的最大特點就是事務的一致性
3、簡單來說,關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。

 

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

2、使用方便:通用的SQL語言使得操作關係型數據庫非常方便;
3、易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗餘和數據不一致的概率;

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

 

 

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

2、固定的表結構
3、高併發讀寫需求;
4、海量數據的高效率讀寫

 

 

非關係型數據庫

MongoDb、redis、HBase

 

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

2、分佈式;
3、一般不支持ACID特性;

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

 

 

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

2、基於鍵值對,數據沒有耦合性容易擴展
3、存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,而關係型數據庫則只支持基礎類型。

 

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

2、無事務處理,附加功能bi和報表等支持也不好;
  • 常用SQL語句(DDL,DML,DCL,TCL)
  • 數據庫中join的類型與區別(inner join, outer join, cross join, natural join, self join),注意適用場景和sql語句的編寫
  • 數據庫的索引類型

  1. 主鍵索引: 數據列不允許重複,不允許爲NULL.一個表只能有一個主鍵。
  2. 唯一索引: 數據列不允許重複,允許爲NULL值,一個表允許多個列創建唯一索引。
  3. 普通索引: 基本的索引類型,沒有唯一性的限制,允許爲NULL值。
  4. 聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個
  5. 非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小於249個
     
  • 聚集索引和非聚集索引的區別(葉節點存儲內容)

  1. 非聚集索引葉子節點並非數據節點。
  2. 葉子節點爲每個真正的數據行存儲一個“鍵-指針” 對
  3. 葉子節點還存儲了一個指針偏移量,根據頁指針及指針偏移可以定位到具體的數據行
  4. 在除葉節點外的其他索引節點,存儲的是類似的內容,只不過指針指向的是下一級的索引。
  • 唯一性索引和主碼索引的區別
  • 索引的優缺點,什麼時候使用索引,什麼時候不能使用索引(重點)

定義:索引是對數據庫表中的一列或多列值進行排序的一種結構,使用索引可以快速訪問數據庫表中的特定信息。
作用:索引相當於圖書上的目錄,可以根據目錄上的頁碼快速找到所需的內容,提高性能(查詢速度)

優點:

  1. 通過創建唯一性索引,可以保證數據庫表中的每一行數據的唯一性。
  2. 可以加快數據的檢索速度
  3. 可以加速表與表之間的連接
  4. 在使用分組和排序進行檢索的時候,可以減少查詢中分組和排序的時間

缺點:

  1. 創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。
  2. 索引需要佔用物理空間,數據量越大,佔用空間越大
  3. 會降低表的增刪改的效率,因爲每次增刪改索引,都需要進行動態維護

什麼時候需要創建索引:

  1. 主鍵自動建立唯一索引
  2. 頻繁作爲查詢條件的字段應該創建索引
  3. 查詢中排序的字段創建索引將大大提高排序的速度(索引就是排序加快速查找)
  4. 查詢中統計或者分組的字段;

什麼時候不需要創建索引:

  1. 頻繁更新的字段不適合創建索引,因爲每次更新不單單是更新記錄,還會更新索引,保存索引文件
  2. where條件裏用不到的字段,不創建索引;
  3. 表記錄太少,不需要創建索引;
  4. 經常增刪改的表;
  5. 數據重複且分佈平均的字段,因此爲經常查詢的和經常排序的字段建立索引。注意某些數據包含大量重複數據,因此他建立索引就沒有太大的效果,例如性別字段,只有男女,不適合建立索引
     

 

  • 索引的底層實現(B+樹,爲何不採用紅黑樹,B樹)

實現方法:一般分爲B+樹索引和哈希索引。

  1. B+樹索引:在B-tree上改進得到,其非葉子節點均爲key值,葉子節點是key-data鍵值對。葉子節點前後相連且有序。
  2. 哈希索引:通過對key進行hash(crc/MD5/sha1/sha256...)而將記錄存儲在不同的bucket種,可以做到常數時間的查找,但要注意哈希衝突的避免(鏈表法、線性探測、二次探測、公共溢出區的方法)。其中MD5 128位,和sha1/256碼都較長不太適合作爲hash函數。默認無序。

爲什麼有了B+樹索引還要hash索引?

  1. B+樹默認有序,hash默認無序,所以哈希索引無法用於排序;
  2. 哈希索引O(1)在速度上毋庸置疑要快於B+樹近似O(logn);
  3. 哈希索引只能進行等值查詢(因爲他要計算hash(key)再去匹配)而B+樹索引可以進行等值、部分前綴、範圍查詢;
  4. 底層實現結構不同:B+樹是非線性結構,hash桶是線性結構。
  5. 對於某些場景如熱點頁/活躍查詢頁,需要藉助哈希索引來實現快速查詢。
  • B樹和B+樹具體實現
  • 索引最左前綴問題
  • Mysql的優化(高頻,索引優化,性能優化)
  • 數據庫引擎介紹,Innodb和Myisam的特點與區別

數據庫引擎:用於存儲、處理、保護數據的核心服務。
當你訪問數據庫時,不管是手工訪問,還是程序訪問,都不是直接讀寫數據庫文件,而是通過數據庫引擎去訪問數據庫文件

  1. InnoDB支持事務,MyISAM不支持,對於InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務;
  2. InnoDB支持外鍵,而MyISAM不支持。對一個包含外鍵的InnoDB錶轉爲MYISAM會失敗;
  3. InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快;
  4. Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;
  5. 鎖機制不同: InnoDB 爲行級鎖,myisam 爲表級鎖。
     
  • 數據庫中事務的ACID(四大特性都要能夠舉例說明,理解透徹,比如原子性和一致性的關聯,隔離性不好會出現的問題)
  • 原子性:事務被視爲不可分割的最小單元,事物的所有操作要不成功,要不失敗回滾,而回滾可以通過日誌來實現,日誌記錄着事務所執行的修改操作,在回滾時反向執行這些修改操作。
  • 一致性:數據庫在事務執行前後都保持一致性狀態,在一致性狀態下,所有事務對一個數據的讀取結果都是相同的。
  • 隔離性:一個事務所做的修改在最終提交以前,對其他事務是可不見的。
  • 持久性:一旦事務提交,則其所做的修改將會永遠保存到數據庫中。
  • 數據庫隔離性設置不同會出現的問題(髒讀、不可重複讀、丟失修改、幻讀)
  • 數據庫的隔離級別,Mysql和Oracle的隔離級別分別是什麼
  • 數據庫連接池的作用

  1. 限定數據庫的個數,不會導致由於數據庫連接過多而導致系統運行緩慢或崩潰;
  2. 數據庫連接不需要每次都去創建和銷燬,節約了資源;
  3. 數據庫連接不需要每次都去創建,響應時間更快。
  • Mysql的表空間方式,各自特點
  • 分佈式事務
  • 數據庫的範式

第一範式:當關系模式R的所有屬性都不能再分解爲更基本的數據單位時,稱R是滿足第一範式,即屬性不可分

第二範式:如果關係模式R滿足第一範式,並且R得所有非主屬性都完全依賴於R的每一個候選關鍵屬性,稱R滿足第二範式

第三範式:設R是一個滿足第一範式條件的關係模式,X是R的任意屬性集,如果X非傳遞依賴於R的任意一個候選關鍵字,稱R滿足第三範式,即非主屬性不傳遞依賴於鍵碼

  • 數據的鎖的種類,加鎖的方式

按鎖級別劃分:共享鎖,排他鎖(讀鎖、寫鎖)

共享鎖(S鎖):用於不更改或不更新數據的操作(只讀操作),如 SELECT 語句。
事務對數據A加上共享鎖後,其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀數據,不能修改數據

排他鎖(X鎖):用於數據修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。


按使用方式劃分:樂觀鎖,悲觀鎖

樂觀鎖:每次去拿數據的時候都認爲別人不會修改,故不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據
示例:版本號或時間戳控制
適用範圍:適用於多讀少寫的場景

悲觀鎖:每次去拿數據的時候都認爲別人會修改,故每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖
實例:DB的行鎖、表鎖等
適用範圍:適用於數據一致性比較高的場景
 

  • 視圖的作用與使用方法(如何刪除等)

視圖是從一個或幾個基本表(或視圖)導出的表。它與基本表不同,是一個虛表。數據庫中只存放視圖的定義,而不存放視圖對應的數據,這些數據仍存放在原來的基本表中。所以一旦基本表中的數據發生變化,從視圖中查詢出的數據也就隨之改變了。從這個意義上講,視圖就像一個窗口,透過它可以看到數據庫中自己感興趣的數據及其變化。
視圖一經定義,就可以和基本表一樣被查詢、被刪除。也可以在一個視圖上再定義新的視圖,但對視圖的更新(增、刪、改)操作則有一定的限制。

  • 分庫分表,主從複製,讀寫分離。(我不會,也沒碰到過)

主從複製:

將主數據庫中的DDL和DML操作通過二進制日誌(BINLOG)傳輸到從數據庫上,然後將這些日誌重新執行(重做);從而使得從數據庫的數據與主數據庫保持一致。

主從複製作用:

  1. 主數據庫出現問題,可以切換到從數據庫。
  2. 可以進行數據庫層面的讀寫分離。
  3. 可以在從數據庫上進行日常備份。 ### 複製過程
  • 項目中哪裏用到了數據庫,怎麼用的
  • Memcache和Redis瞭解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章