認真寫文章,用心做分享。公眾號:Java耕耘者 文章都會在裡面更新,整理的資料也會放在裡面。
MySQL面試常問的一些基礎問題,希望對大家有所幫助。
Mysql索引類型
普通索引 唯一索引 主鍵索引 組合索引
什麼情況下索引失效 (必問)
索引什麼時候不會生效,以下集中情況會導致索引失效:
1.條件中用or,即使其中有條件帶索引,也不會使用索引查詢(這就是查詢儘量不要用or的原因,用in吧)
注意:使用or,又想索引生效,只能將or條件中的每個列都加上索引
2.對於多列索引,不是使用的第一部分,則不會使用索引。
3.like的模糊查詢以%開頭,索引失效
4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不會使用索引
B+Tree 和 hash 區別
一、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的二級索引在葉子節點中保存了行的主鍵值,所以如果二級主鍵能夠覆蓋查詢,則可以避免對主鍵索引的二次查詢)
使用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相關技術!
本文到這裡就結束了,喜歡的朋友可以幫忙轉發和關注一下,感謝支持!
閱讀更多 Java耕耘 的文章