@
- 前言
- 背景
- 1. 什麼是存儲過程?有哪些優缺點?
- 2. 數據庫三個範式是什麼
- 3. 索引是什麼?有什麼作用以及優缺點?
- 4. 什麼時候要創建索引?
- 5. 索引分類有哪些?
- 6. 索引的數據結構:
- 7. 為什麼使用B+Tree作為索引:
- 8. MySQL 索引底層結構為什麼使用 B+樹?
- 9. B+ 樹的葉子節點鏈表是單向還是雙向?
- 10. MySQL主從複製的原理:
- 11. Mysql主從複製的好處
- 12. Mysql主從數據源的配置
- 13. 主鍵一般用自增ID還是UUID?
- 14. 什麼是ACID事務?
- 15. MySQL中四種隔離級別分別是什麼?
- 16. 數據庫的樂觀鎖和悲觀鎖是什麼?
- 17. Mysql存儲引擎?
- 18. Varchar和Char的區別?
- 19. Mysql中表鎖和行鎖的區別
- 20. MySQL和Oracle在操作上的一些區別?
- 21. MVCC (多版本併發控制)
- 總結
前言
請各大網友尊重本人原創知識分享,謹記本人博客:南國以南i、微信公眾號:白碼夢想家
提示:以下是本篇文章正文內容,下面案例可供參考
背景
Hello 朋友們,接下來為大家開啓,面試題相關係列☞《對線面試官》
自信出擊,讓 offer 手到擒來!!!
1. 什麼是存儲過程?有哪些優缺點?
存儲過程就像我們編程語言中的函數一樣,封裝了我們的代碼(PLSQL、T-SQL)。
-
存儲過程的優點:
1.能夠將代碼封裝起來
2.保存在數據庫之中
3.讓編程語言進行調用
4.存儲過程是一個預編譯的代碼塊,執行效率比較高 -
存儲過程的缺點:
1.每個數據庫的存儲過程語法幾乎都不一樣,十分難以維護(不通用)
2.業務邏輯放在數據庫上,難以迭代
2. 數據庫三個範式是什麼
第一範式: 字段是最小的的單元不可再分
第二範式: 滿足第一範式,表中的字段必須完全依賴於全部主鍵而非部分主鍵。(主鍵是唯一的,它們只需要依賴於主鍵,也就成了唯一的)
第三範式: 滿足第二範式,非主鍵外的所有字段必須互不依賴。(就是數據只在一個地方存儲,不重複出現在多張表中)
3. 索引是什麼?有什麼作用以及優缺點?
(1)是一種快速查詢表中內容的機制,類似於新華字典的目錄
(2)運用在表中某個些字段上,但存儲時,獨立於表之外
優點: 索引加快數據庫的檢索速度
缺點: 索引降低了插入、刪除、修改等維護任務的速度(雖然索引可以提高查詢速度,但是它們也會導致數據庫系統更新數據的性能下降,因為大部分數據更新需要同時更新索引)
4. 什麼時候要創建索引?
(1)表經常進行 SELECT 操作
(2)表很大(記錄超多),記錄內容分佈範圍很廣
(3)列名經常在 WHERE 子句或連接條件中出現
5. 索引分類有哪些?
唯一索引、主鍵索引、聚集索引、非聚集索引
-
主鍵索引: 它 是一種特殊的唯一索引,不允許有空值。 -
唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。 -
普通索引:普通索引 (由關鍵字KEY或INDEX定義的索引) 的唯一任務是加快對數據的訪問速度。 -
全文索引:只能作用MyISAM在 CHAR、VARCHAR、TEXT、類型的字段上。創建全文索引需要使用 FULLTEXT 參數進行約束。 -
聯合索引:遵循最左前綴’原則,簡單的理解就是隻從最左面的開始組合,查詢時使用字段中的第一個字段,索引才會被使用。覆蓋索引,減少查詢次數 -
空間索引:只有 MyISAM 類型的表支持該類型 ‘ 空間索引 ’。而且,索引字段必須有非空約束。
6. 索引的數據結構:
- 常見的索引的數據結構有:
B+Tree、Hash索引。
-
Hash索引:
MySQL中只有Memory存儲引擎支持hash索引,是Memory表的默認索引類型。hash索引把數據以hash值形式組織起來,因此查詢效率非常高,可以一次定位。
hash索引的缺點:
Hash索引僅能滿足等值的查詢,不能滿足範圍查詢、排序。因為數據在經過Hash算法後,其大小關係就可能發生變化。 -
B+Tree索引:
B+Tree是mysql使用最頻繁的一個索引數據結構,是Innodb和Myisam存儲引擎模式的索引類型。
B+Tree索引在查找時需要從根節點到葉節點進行多次IO操作,在查詢速度比不上Hash索引,但是更適合排序等操作。
7. 為什麼使用B+Tree作為索引:
頁內節點不存儲內容,每次IO可以讀取更多的行,大大減少磁盤I/O讀取次數
換句話説,索引的數據結構要儘量減少查找過程中磁盤I/O的存取次數。
8. MySQL 索引底層結構為什麼使用 B+樹?
Hash索引 雖然能夠提供 O(1) 的單數據行操作性能,但是對於範圍查詢和排序卻無法很好地支
持,最終導致全表掃描;
B 樹 能夠在非葉節子點中存儲數據,但是這也導致在查詢連續數,據時可能會帶來更多的隨機 I/O;
B+樹 的所有葉節點是通過鏈表指針相互連接,能夠減少順序遍歷時產生的額外隨機 I/O;
-
第一,B 樹一個節點裏存的是數據,而 B+樹存儲的是索引(地址),所以 B 樹裏一個節
點存不了很多個數據,但是 B+樹一個節點能存很多索引,B+樹葉子節點存所有的數據。 -
第二,B+樹的葉子節點是數據階段用了一個鏈表串聯起來,便於範圍查找
9. B+ 樹的葉子節點鏈表是單向還是雙向?
雙向鏈表
10. MySQL主從複製的原理:
Slave從Master獲取binlog二進制日誌文件,然後再將日誌文件解析成相應的SQL語句在從服務器上重新執行一遍主服務器的操作,通過這種方式來保證數據的一致性。
由於主從複製的過程是異步複製的,因此Slave和Master之間的數據有可能存在延遲的現象,只能保證數據最終的一致性。
11. Mysql主從複製的好處
(1)讀寫分離,通過動態增加從服務器來提高數據庫的性能,在主服務器上執行寫入和更新,在從服務器上執行讀功能。
(2)提高數據安全,因為數據已複製到從服務器,從服務器可以終止複製進程,所以,可以在從服務器上備份而不破壞主服務器相應數據。
(3)在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提高主服務器的性能
通過主從複製可以實現數據備份、故障轉移、MySQL集羣、高可用、讀寫分離等。
12. Mysql主從數據源的配置
我們需要配置主從數據庫,主從數據庫的配置一般都是寫在配置文件裏面。通過@ConfigurationProperties註解,可以將配置文件
(一般命名為:application.Properties)裏的屬性映射到具體的類屬性上,從而讀取到寫入的值注入到具體的代碼配置中,按照習慣大於約定的原則,
主庫我們都是注為master,從庫注為slave,本項目採用了阿里的druid數據庫連接池,使用build建造者模式創建DataSource對象,DataSource就是
代碼層面抽象出來的數據源,接着需要配置sessionFactory、sqlTemplate、事務管理器等
13. 主鍵一般用自增ID還是UUID?
-
使用UUID的優點:
無需擔心業務量泄露的問題。
唯一標識,不用考慮重複問題,在數據拆分、合併時也能達到全局的唯一性。 -
UUID的缺點:
因為UUID是隨機生成的,所以會發生隨機IO,影響插入速度,並且會造成硬盤的使用率較低。
UUID佔用空間較大,建立的索引越多,造成的影響越大。
UUID之間比較大小較自增ID慢不少,影響查詢速度。 -
自增ID的優點:
字段長度較 UUID 會小很多。
數據庫自動編號,按順序存放,利於檢索 -
自增ID的缺點:
因為是自增,在某些業務場景下,容易被其他人查到業務量。
發生數據遷移時,或者表合併時會非常麻煩
在高併發的場景下,競爭自增鎖會降低數據庫的吞吐能力
1、項目是單機版的,並且數據量比較大(百萬級)時,用自增長的,此時最好能考慮下安全性,做些安全措施。
2、項目是單機版的,並且數據量沒那麼大,對速度和存儲要求不高時,用UUID。
3、項目是分佈式的,那麼首選UUID,分佈式一般對速度和存儲要求不高。
4、項目是分佈式的,並且數據量達到千萬級別可更高時,對速度和存儲有要求時,可以用自增長。
14. 什麼是ACID事務?
ACID包含:
原子性(Atomicity):一個事務中的所有操作,要麼全部完成,要麼全部不完成
一致性(Consistency):在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞
隔離性(Isolation):多個併發事務同時,其事務對彼此不可見
持久性(Durability):事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失
15. MySQL中四種隔離級別分別是什麼?
讀未提交:未提交讀隔離級別也叫髒讀,就是事務可以讀取其它事務未提交的數據。
讀已提交:在其它數據庫系統比如 SQL Server 默認的隔離級別就是提交讀,已提交讀隔離級別就是在事務未提交之前所做的修改其它事務是不可見的。
可重複讀:保證同一個事務中的多次相同的查詢的結果是一致的,可重複讀也是 MySQL的默認隔離級別。
可串行化:同一數據讀寫都加鎖,避免髒讀,性能不忍直視。
16. 數據庫的樂觀鎖和悲觀鎖是什麼?
確保在多個事務同時存取數據庫中同一數據時不破壞事務的隔離性和統一性以及數據庫的統一性,樂觀鎖和悲觀鎖是併發控制主要採用的技術手段。
樂觀鎖:
在修改數據的時候把事務鎖起來,通過version的方式來進行鎖定- 實現方式: 每次添加修改時使用version版本號或者時間戳
悲觀鎖:
在查詢完數據的時候就把事務鎖起來,直到提交事務- 實現方式: 使用數據庫中的鎖機制
17. Mysql存儲引擎?
Innodb引擎,Innodb引擎提供了對數據庫ACID事務的支持。並且還提供了行級鎖和外鍵的約束。它的設計的目標就是處理大數據容量的數據庫系統。
MyIASM引擎(原本Mysql的默認引擎),不提供事務的支持,也不支持行級鎖和外鍵。
MEMORY引擎:所有的數據都在內存中,數據的處理速度快,但是安全性不高。
18. Varchar和Char的區別?
Char是一種固定長度的類型,varchar是一種可變長度的類型
19. Mysql中表鎖和行鎖的區別
-
行鎖
特點:鎖的粒度小,發生鎖衝突的概率低、處理併發的能力強;開銷大、加鎖慢、會出現死鎖
加鎖的方式:自動加鎖。對於UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數據集加排他鎖;對於普通SELECT語句,InnoDB不會加任何鎖。 -
表鎖
特點:開銷小、加鎖快、無死鎖;鎖粒度大,發生鎖衝突的概率高,高併發下性能低
20. MySQL和Oracle在操作上的一些區別?
-
1、主鍵
MySQL 一般使用自動增長類型主鍵,在創建表時只要指定表的主鍵為auto increment,插入記錄時,不需要再指定該記錄的主鍵值,MySQL將自動增長。
Oracle沒有自動增長類型,需要自增主鍵時一般使用的序列,插入記錄時將 序列號的下一個值付給該字段即可。如果不需要使用自增主鍵,一般會選擇使用全劇唯一的流水號作為Oracle數據庫的主鍵。 -
2、分頁查詢
MySQL一般使用limit關鍵字進行分頁查詢,有時候也可以利用自增主鍵加order by 命令加 limit進行分頁查詢
Oracle處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM字段標明它的位置, 並且只能用ROWNUM<?, 不能用ROWNUM>?,需要大於則要用到別名來進行處理 -
3、權限與安全
在Oracle中有一個用户的概念,用來登錄到數據庫,比如openlab用户。用户擁有一定的權限,可以創建表、視圖等。用户名下的數據表,安全性高於MySQL。
MySQL中對應於Oracle中用户的概念是database。登陸後要先建立database,才能建表。MySQL的用户與主機有關,很容易被仿冒。
21. MVCC (多版本併發控制)
實現細節
每行數據都存在一個版本,每次數據更新時都更新該版本。
修改時 Copy 出當前版本隨意修改,各個事務之間互不干擾。
保存時比較版本號,如果成功(commit),則覆蓋原記錄;失敗則放棄 copy(rollback)。
Inno DB 實現
在 InnoDB 中為每行增加兩個隱藏的字段,分別是該行數據創建時的版本號和刪除時的版本號,
這裏的版本號是系統版本號(可以簡單理解為事務的 ID),每開始一個新的事務,系統版本號就自動遞增,作為事務的 ID 。
通常這兩個版本號分別叫做創建時間和刪除時間。
總結
我是南國以南i記錄點滴每天成長一點點,學習是永無止境的!轉載請附原文鏈接!!!