1. 程式人生 > >面試----mysql--索引,鎖--怎麼答

面試----mysql--索引,鎖--怎麼答

1:首先Mysql的基本儲存結構是頁(記錄都存在頁裡邊):每個資料頁都會為儲存在它裡邊兒的記錄生成一個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應的槽,然後再遍歷該槽對應分組中的記錄即可快速找到指定的記錄

2:索引做了些什麼可以讓我們查詢加快速度呢?其實就是將無序的資料變成有序(相對):

一個沒加主鍵的表,它的資料無序的放置在磁碟儲存器上,一行一行的排列的很整齊, 跟我認知中的「表」很接近。如果給表上了主鍵,那麼表在磁碟上的儲存結構就由整齊排列的結構轉變成了樹狀結構,也就是說的「平衡樹」結構,換句話說,就是整個表就變成了一個索引。

整個表變成了一個索引,也就是所謂的「聚集索引」。 這就是為什麼一個表只能有一個主鍵, 一個表只能有一個「聚集索引」,因為主鍵的作用就是把「表」的資料格式轉換成「索引(平衡樹)」的格式放置

物都是有兩面的, 索引能讓資料庫查詢資料的速度上升, 而使寫入資料的速度下降,原因很簡單的, 因為平衡樹這個結構必須一直維持在一個正確的狀態, 增刪改資料都會改變平衡樹各節點中的索引資料內容,破壞樹結構, 因此,在每次資料改變時, DBMS必須去重新梳理樹(索引)的結構以確保它的正確,這會帶來不小的效能開銷。

每次給欄位建一個新索引, 欄位中的資料就會被複制一份出來, 用於生成索引。 因此, 給表新增索引,會增加表的體積, 佔用磁碟儲存空間。

非聚集索引和聚集索引的區別在於, 通過聚集索引可以查到需要查詢的資料, 而通過非聚集索引可以查到記錄對應的主鍵值 , 再使用主鍵的值通過聚集索引查詢到需要的資料

3:B+樹是平衡樹的一種。平衡樹:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。如果一棵普通的樹在極端的情況下,是能退化成連結串列的(樹的優點就不復存在了)B+樹是平衡樹的一種,是不會退化成連結串列的,樹的高度都是相對比較低的。

4:雜湊索引就是採用一定的雜湊演算法,把鍵值換算成新的雜湊值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查詢,只需一次雜湊演算法即可立刻定位到相應的位置,速度非常快

  • 不支援最左匹配原則
  • 在有大量重複鍵值情況下,雜湊索引的效率也是極低的---->雜湊碰撞問題。
  • 不支援範圍查詢

5:InnoDB:主流的還是使用B+樹索引比較多,對於雜湊索引,InnoDB是自適應雜湊索引

6:聚集和非聚集索引:

  • 聚集索引就是以主鍵建立的索引
  • 非聚集索引就是以非主鍵建立的索引

區別:

  • 聚集索引在葉子節點儲存的是表中的資料
  • 非聚集索引在葉子節點儲存的是主鍵和索引列
  • 使用非聚集索引查詢出資料時,拿到葉子上的主鍵再去查到想要查詢的資料。(拿到主鍵再查詢這個過程叫做回表)

7:鎖

首先,從鎖的粒度,我們可以分成兩大類:

  • 表鎖
    • 開銷小,加鎖快;不會出現死鎖;鎖定力度大,發生鎖衝突概率高,併發度最低
  • 行鎖
    • 開銷大,加鎖慢;會出現死鎖;鎖定粒度小,發生鎖衝突的概率低,併發度高

不同的儲存引擎支援的鎖粒度是不一樣的:

  • InnoDB行鎖和表鎖都支援
  • MyISAM只支援表鎖

InnoDB只有通過索引條件檢索資料才使用行級鎖,否則,InnoDB將使用表鎖

  • 也就是說,InnoDB的行鎖是基於索引的

表鎖下又分為兩種模式

  • 表讀鎖(Table Read Lock)
  • 表寫鎖(Table Write Lock)
  • 從下圖可以清晰看到,在表讀鎖和表寫鎖的環境下:讀讀不阻塞,讀寫阻塞,寫寫阻塞。
  • 讀讀不阻塞:當前使用者在讀資料,其他的使用者也在讀資料,不會加鎖
  • 讀寫阻塞:當前使用者在讀資料,其他的使用者不能修改當前使用者讀的資料,會加鎖!
  • 寫寫阻塞:當前使用者在修改資料,其他的使用者不能修改當前使用者正在修改的資料,會加鎖!

 

  • InnoDB實現了以下兩種型別的行鎖。

  • 共享鎖(S鎖):允許一個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。
    • 也叫做讀鎖:讀鎖是共享的,多個客戶可以同時讀取同一個資源,但不允許其他客戶修改
  • 排他鎖(X鎖):允許獲得排他鎖的事務更新資料,阻止其他事務取得相同資料集的共享讀鎖和排他寫鎖。
    • 也叫做寫鎖:寫鎖是排他的,寫鎖會阻塞其他的寫鎖和讀鎖
  •