面試筆記:MySQL索引基礎知識必問包含了答案

認真寫文章,用心做分享。公眾號:Java耕耘者 文章都會在裡面更新,整理的資料也會放在裡面。

MySQL面試常問的一些基礎問題,希望對大家有所幫助。

面試筆記:MySQL索引基礎知識必問包含了答案

Mysql索引類型

普通索引 唯一索引 主鍵索引 組合索引

什麼情況下索引失效 (必問)

索引什麼時候不會生效,以下集中情況會導致索引失效:

1.條件中用or,即使其中有條件帶索引,也不會使用索引查詢(這就是查詢儘量不要用or的原因,用in吧)

面試筆記:MySQL索引基礎知識必問包含了答案

注意:使用or,又想索引生效,只能將or條件中的每個列都加上索引

2.對於多列索引,不是使用的第一部分,則不會使用索引。

3.like的模糊查詢以%開頭,索引失效

面試筆記:MySQL索引基礎知識必問包含了答案

4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不會使用索引

面試筆記:MySQL索引基礎知識必問包含了答案

B+Tree 和 hash 區別

面試筆記:MySQL索引基礎知識必問包含了答案

一、BTree

BTree索引是最常用的mysql數據庫索引算法,因為它不僅可以被用在=,>,>=,

select * from user where name like ‘jack%’

select * from user where name like ‘jac%k%’

如果一通配符開頭,或者沒有使用常量,則不會使用索引,例如:

select * from user where name like ‘%jack’

select * from user where name like simply_name

二、Hash

Hash索引只能用於對等比較,例如=,<=>(相當於=)操作符。由於是一次定位數據,不像BTree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次IO訪問,所以檢索效率遠高於BTree索引。

一條慢查詢怎麼優化 ,步驟是什麼?

第一步 找到sql 第二步 explain 運行執行計劃 分析結果

什麼是覆蓋索引?

1.索引條目通常遠小於數據行大小,只需要讀取索引,則mysql會極大地減少數據訪問量。

2.因為索引是按照列值順序存儲的,所以對於IO密集的範圍查找會比隨機從磁盤讀取每一行數據的IO少很多。

3.一些存儲引擎如myisam在內存中只緩存索引,數據則依賴於操作系統來緩存,因此要訪問數據需要一次系統調用

4.innodb的聚簇索引,覆蓋索引對innodb表特別有用。(innodb的二級索引在葉子節點中保存了行的主鍵值,所以如果二級主鍵能夠覆蓋查詢,則可以避免對主鍵索引的二次查詢)

面試筆記:MySQL索引基礎知識必問包含了答案

使用sql語句創建一個普通索引

(1)CREATE INDEX index_mytable_name ON mytable(name)

(2)ALTER TABLE mytable ADD INDEX index_mytable_name (name)

B+Tree 和 hash 區別 以下五點必須全部理解

1 如果是等值查詢,那麼哈希索引明顯有絕對優勢。

2 hash 不支持如果範圍查詢檢索 因為原先是有序的鍵值,經過哈希算法後,有可能變成不連續的了,就沒辦法再利用索引完成範圍查詢檢索。

3 同理,哈希索引也沒辦法利用索引完成排序,以及like ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是範圍查詢)。

4 哈希索引也不支持多列聯合索引的最左匹配規則;也就是說不支持聯合索引查詢。

5 在有大量重複鍵值情況下,哈希索引的效率也是極低的,因為存在所謂的哈希碰撞問題。

點關注,不迷路;持續更新Java相關技術!

本文到這裡就結束了,喜歡的朋友可以幫忙轉發和關注一下,感謝支持!


分享到:


相關文章: