資料庫面試題
阿新 • • 發佈:2020-08-11
資料庫的架構
如何設計一個關係型資料庫(資料庫的架構)
索引
索引的簡介
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.更多的索引意味著也需要更多的空間