天天看點

MySQL面試知識點

資料庫面試

1. 存儲子產品

存儲管理、緩存機制、SQL解析、日志管理、權限劃分、容災機制、索引管理、鎖管理

MySQL面試知識點

2. 索引子產品

2.1 為什麼使用索引

a.加快查詢速度,提高系統的性能

b.通過建立唯一性索引,可以保證資料庫表行資料的唯一性

2.2 MySQL索引的使用

索引在MYSQL中使用分為以下幾類:

a. B+ -Tree索引

b. Hash索引

c. 全文索引

開發中最常接觸到的 InnoDB 存儲引擎中的 B+ 樹索引.要介紹 B+ 樹索引,就不得不提二叉查找樹,平衡二叉樹和 B 樹這三種資料結構。B+ 樹就是從他們仨演化來的。

此處二叉樹和平衡二叉樹不做解釋,可以百度資料結構進行學習

B樹結構圖:

MySQL面試知識點

從上圖可以看出,B樹相對于平衡二叉樹,每個節點存儲了更多的鍵值(key)和資料(data),并且每個節點擁有更多的子節點,子節點的個數一般稱為階,上述圖中的B 樹為 3 階 B 樹,高度也會很低。

基于這個特性,B 樹查找資料讀取磁盤的次數将會很少,資料的查找效率也會比平衡二叉樹高很多。

B+ 樹

B+樹是對B樹的進一步優化。結果圖如下:

MySQL面試知識點

a. B+樹非葉子節點不存儲資料,僅存儲鍵值

b. 這樣的話,非葉子節點會存儲更多的鍵值,相應的數的階數(葉子節點)就會更大,樹的深度越小,進行磁盤IO的操作将減少,資料查詢效率也會更快

c. B+樹各個頁之間是通過雙向連結清單連接配接的,葉子節點中的資料是通過單向連結清單連接配接的,是以資料是有序的,友善範圍查詢

MyISAM 中的 B+ 樹索引實作與 InnoDB 中的略有不同。在 MyISAM 中,B+ 樹索引的葉子節點并不存儲資料,而是存儲資料的檔案位址。

2.3 聚簇索引和非聚簇索引

a. 聚簇索引:以 InnoDB 作為存儲引擎的表,表中的資料都會有一個主鍵,即使你不建立主鍵,系統也會幫你建立一個隐式的主鍵。

這是因為 InnoDB 是把資料存放在 B+ 樹中的,而 B+ 樹的鍵值就是主鍵,在 B+ 樹的葉子節點中,存儲了表中所有的資料。

這種以主鍵作為 B+ 樹索引的鍵值而建構的 B+ 樹索引,我們稱之為聚集索引。

b. 非聚簇索引:以主鍵以外的列值作為鍵值建構的 B+ 樹索引,我們稱之為非聚集索引。

非聚集索引與聚集索引的差別在于非聚集索引的葉子節點不存儲表中的資料,而是存儲該列對應的主鍵,想要查找資料我們還需要根據主鍵再去聚集索引中進行查找,這個再根據聚集索引查找資料的過程,我們稱為回表。

在 MyISAM 中,聚集索引和非聚集索引的葉子節點都會存儲資料的檔案位址。

2.4 Hash索引

在MySQL的存儲引擎中,MyISAM不支援哈希索引,而InnoDB中的hash索引是存儲引擎根據B-Tree索引自建的

1、hash索引是基于hash表實作的,隻有查詢條件精确比對hash索引中的所有列的時候,才能用到hash索引。

2、對于hash索引中的所有列,存儲引擎都會為每一行計算一個hash碼,hash索引中存儲的就是hash碼。

3、hash索引包括鍵值、hash碼和指針 。

Hash索引查詢效率高于B+ -tree,但隻能精确查詢,因為每個hash值之間沒有關系,是以不能進行排序和範圍查詢

2.5 索引越多越好嗎?

a. 對于資料少的表資料,不使用索引,系統開銷小 多索引

b. 需要多元護,占用額外空間

3. 如何定位并優化慢查詢Sql

a. 根據慢日志定位慢查詢sql

b. 使用explain工具分析sqll

c. 修改sql或者讓sql走索引

4.鎖子產品

4.1 MyISAM與InnoDB關于鎖方面的差別是什麼

MyISAM預設使用表鎖,而InnoDB預設使用行鎖,同時也支援表鎖。

在MySQL中某個事物打開共享讀鎖,進行讀操作,其他事物進行寫操作是不受影響的,因讀鎖起到共享的作用。而此事物 打開寫鎖進行寫操作,其他事物進行讀操作會進入阻塞狀态,直至排它鎖釋放。

4.1.1 表鎖和行鎖的差別
表鎖:鎖表快、開銷小、鎖的粒度大,并發處理能力低,發生鎖沖突機率高,不會出現死鎖現象
行鎖:鎖表慢、開銷大、鎖的粒度小、并發處理能力高,發生鎖沖突的機率低,會出現死鎖現象

4.1.2 悲觀鎖和樂觀鎖
悲觀鎖:每次拿資料都會認為别人會修改,是以每次在拿資料前都會上鎖,這樣别人想拿這個資料就會阻塞,直至他獲得鎖資源,共享資源每次将提供給一個線程其他線程進入阻塞狀态,用完後則會将資源轉讓給其他線程。傳統的關系型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨占鎖就是悲觀鎖思想的實作。
 樂觀鎖:每次拿資料都會認定别人不會修改,是以不會上鎖,但是在更新的時候會判斷在此期間沒有有人修改這個資料,可以使用版本号機制和CAS算法實作。适用于多讀的應用場景,這樣可以提高吞吐量。
           

5. 資料庫事務的四大特性(ACID)

原子性:事務是資料庫的最小工作機關,不可分割,是以事務包含的多個操作要麼全部失敗或者成功

一緻性:事務執行前後要保持一緻

隔離性: 多個事務之間互不影響,及一個事務内部對資料的操作對于其他事務是隔離的,不受其他事務的影響

持久性:事務一旦送出,他對資料庫的中的資料的該表是持久化的,并且不能復原

5.1 事務隔離級别以及各級别出現的問題

事務在并發通路下會出現的問題:更新丢失、髒讀、不可重複的、幻讀
事務隔離級别:讀未送出、讀以送出、可重複讀、序列化

更新丢失:在并發場景下,兩個事務修改同一資料導緻後邊修改資料覆寫前邊修改的資料,破壞了事務的一緻性原則,進而導緻資料丢失
将資料庫事務的隔離級别設定為讀未送出,會解決更新丢失的問題,但會出現髒讀、不可重複的、幻讀現象

髒讀:在并發場景下,一個事務讀取到另一個事務沒有送出的資料,讀取到了髒資料,進而導緻讀取的資料不正确
将資料庫事務隔離級别設定為讀以送出,會解決髒讀問題,但會出現不可重複的、幻讀現象

不可重複讀:在并發場景下,一個事務讀取到另外一個事務送出的資料,導緻兩次讀取不一緻
将資料庫事務隔離級别設定為可重複讀, 會解決不可重複讀問題,但會出現幻讀現象

幻讀:在并發場景下,一個事務讀取到另一個事務加入或删除的資料,導緻多讀或少讀的現象
将資料庫事務隔離級别設定為序列化, 會解決幻讀問題及其他問題,序列化是資料庫事務最高的隔離級别
           

延伸問題:InnoDB可重複讀隔離級别下如何避免幻讀

詳情