1. 程式人生 > 實用技巧 >資料庫面試題

資料庫面試題

資料庫的架構

如何設計一個關係型資料庫(資料庫的架構)

索引

索引的簡介

MySQL 官方對索引的定義為:索引(Index)是幫助 MySQL 高效獲取資料的資料結構。

索引的資料結構(B+ 樹)

  • B+ 樹結構圖

  • B+ 樹的特點
1.非葉子節點的子樹指標與關鍵字個數相同
2.非葉子節點的子樹指標P[i],指向關鍵字值[K[i],k[i+1])的子樹
3.非葉子節點僅用來索引,資料都儲存在葉子節點中(查詢只在葉子節點結束)
4.所有葉子節點均有一個鏈指標指向下一個葉子節點(便於資料庫的範圍統計)
  • B+ 樹更適合用來做儲存索引的原因
1.B+樹的磁碟讀寫代價更低(樹的深度低,IO次數少)
2.B+樹的查詢效率更加穩定(所有查詢結果都會在葉子節點結束)
3.B+樹更有利於對資料庫的掃描(通過資料指標橫向掃描資料)

密集索引和稀疏索引的區別

  • 密集索引檔案中的每個搜尋碼值都對應一個索引值(即可根據索引值找到對應的一條資料,因此每張表只能建立一個密集索引)

  • 稀疏索引檔案只為索引碼的某些值建立索引項(即根據索引值找到對應一條資料的地址或主鍵,再根據地址或主鍵找到資料)

MySQL兩種儲存引擎的索引區別

參考的部落格

  • MyISAM
在MyISAM中不管是主鍵索引唯一鍵索引、普通索引,其索引都屬於稀疏索引
  • Innodb
在Innodb中 有且僅有一個密集索引 
Innodb中選取規則:
1.如果一個主鍵被定義了,則該主鍵作為密集索引
2.若該主鍵沒有被定義,則該表的第一個唯一非空索引作為密集索引
3.若不滿足上述條件 則Innodb內部會生成一個隱藏主鍵(密集索引)
4.非主鍵索引儲存相關鍵位和其對應的主鍵值,包含兩次查詢(第一次根據索引值找到對應資料的主鍵,然後根據主鍵找到相應的資料)
  • 兩種引擎索引的例項圖

  • 兩種引擎會建立不同的檔案
1.建立一個MyISAM引擎的資料表 test1 會建立三個檔案
test1.frm   儲存表的結構資訊
test1.MYI  儲存表的索引資訊
test1.MYD 儲存表的資料
2.建立一個InnoDB引擎的資料表 test2 會建立兩個檔案
test2.frm 儲存表的結構資訊
test2.ibd 儲存表的資料和索引

聯合索引的最左匹配原則

參考的部落格

select * from t where a=1 and b=1 and c =1;     #這樣可以利用到定義的索引(a,b,c)

select * from t where a=1 and b=1;     #這樣可以利用到定義的索引(a,b,c)

select * from t where a=1;     #這樣也可以利用到定義的索引(a,b,c)

select * from t where b=1 and c=1;     #這樣不可以利用到定義的索引(a,b,c)

select * from t where a=1 and c=1;     #這樣不可以利用到定義的索引(a,b,c)

也就是說通過最左匹配原則你可以定義一個聯合索引,但是使得多中查詢條件都可以用到該索引。
值得注意的是,當遇到範圍查詢(>、<、between、like)就會停止匹配。也就是:

select * from t where a=1 and b>1 and c =1;     #這樣a,b可以用到(a,b,c),c不可以

總結

  • 在 InnoDB 中聯合索引只有先確定了前一個(左側的值)後,才能確定下一個值。如果有範圍查詢的話,那麼聯合索引中使用範圍查詢的欄位後的索引在該條 SQL 中都不會起作用。

  • 值得注意的是,in= 都可以亂序,比如有索引(a,b,c),語句 select * from t where c =1 and a=1 and b=1,這樣的語句也可以用到最左匹配,因為 MySQL 中有一個優化器,他會分析 SQL 語句,將其優化成索引可以匹配的形式,即 select * from t where a =1 and a=1 and c=1

索引是建立得越多越好嗎

  • 不是
1.資料量小的表不需要建立索引,建立會增加額外的索引開銷
2.資料變更需要維護索引,因此更多的索引意味著更多的維護成本
3.更多的索引意味著也需要更多的空間