Java高頻面試題:談談你對MySQL索引的瞭解
今天帶大家一起看看Mysql索引相關的面試題。
一. MySQL索引分類
我們先來看看MySQL中都有哪些索引。
- 普通索引index:允許出現相同的索引內容create index name on 表名(列名)
- 唯一索引unique:不可以出現相同的值,可以有NULL值create unique age 表名(列名)
- 聯合索引:實質上是將多個欄位建到一個索引裡,列值的組合必須唯一create index name on 表名(列名,列名)
- 全文索引:可以針對值中的某個單詞,但效率不高alter table 表名 engine = MyISAM;--全文索引需求在資料庫MyISAM引擎 alter table 表名 add fulltext index 索引名(列名);
二. 索引的原理
索引的原理,其實就是透過不斷地縮小想要獲取資料的範圍,來篩選出最終想要的結果,同時把隨機的事件變成順序的事件!也就是說,有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。
本質上來說,索引就是讓我們快速檢索資料而設定的一種把資料排好序的資料結構,他需要額外的空間儲存並進行維護。索引底層的資料結構分別有二分查詢法、Hash和B+樹。
三. B+樹
InnoDB引擎使用B+樹作為索引結構。
特點:
- B+ 樹的特點是能夠保持資料穩定有序;
- 插入與修改擁有較穩定的時間複雜度;
- B+ 樹中的元素自底向上插入;
- 葉子節點間透過指標連結,可以透過遍歷葉子節點獲取所有資料。
性質:
- IO次數取決於b+數的高度h,假設當前資料表的資料為N,每個磁碟塊資料項的數量是m,則有h=㏒(m+1)N;
- m = 磁碟塊的大小 / 資料項的大小,磁碟塊的大小也就是一個資料頁的大小,是固定的;
- 索引的最左匹配特性(即從左往右匹配),比如(name,age,sex)的時候,b+樹是按照從左到右的順序來建立搜尋樹的。假如當(張三,20,F)這樣的資料來檢索的時候,b+樹會優先比較name,來確定下一步的搜尋方向。如果name相同,再依次比較age和sex,最後得到檢索的資料。但當(20,F)這樣沒有name的資料進來的時候,b+樹就不知道下一步該查哪個節點了。因為建立搜尋樹的時候,name是第一個比較因子,必須要先根據name來搜尋,才能知道下一步去哪裡查詢。
四. 索引的使用
我們在使用時,還要知道到底該什麼時候使用索引,有以下幾種情況:
- 主鍵自動建立唯一索引;
- 經常作為查詢條件,在WHERE或者ORDER BY 語句中出現的列,應該建立索引;
- 作為排序的列要建立索引;
- 外來鍵關係建立索引;
- 高併發條件下傾向聯合索引;
- 用於聚合函式的列可以建立索引,如max、count的欄位就需要建立索引。
另外我們還要注意,某些操作不當可能會導致索引失效,比如:
- 使用!=或<>運算子時,會全表掃描而不使用索引(ps:如果是主鍵還是會走索引);
- where子句中,對欄位進行 null 判斷會全表掃描;
- where 子句中,使用 or 來連線條件查詢會全表掃描;
- like查詢會全表掃描;
- in 和 not in 會全表掃描;
- where子句中,對欄位進行函式操作,如where datediff(now(),bornDate)=0會導致索引失效。
現在你對索引是不是有了基本地瞭解了呢?當然,受限於篇幅,本文只是簡單讓大家認識一下索引。其實關於索引的內容還有很多,在我們的課程中有專門的索引專題進行講解,歡迎大家學習哦。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70023145/viewspace-2921186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 面試官:談談你對mysql索引的認識?面試MySql索引
- 【Java 容器面試題】談談你對HashMap 的理解Java面試題HashMap
- 面試官:談談你對JVM垃圾收集器的瞭解面試JVM
- Java高頻面試題---MySQLJava面試題MySql
- 面試——談談你對Java 平臺的理解面試Java
- JAVA面試題 請談談你對Sychronized關鍵字的理解?Java面試題Zed
- 談談你對Java平臺的理解,你對Java平臺到底瞭解到了什麼程度?Java
- 面試官:談談你對JVM垃圾收集器演算法的瞭解面試JVM演算法
- Java面試題:請談談對ThreadLocal的理解?Java面試題thread
- 面試——談談你對Java 物件導向思想的理解面試Java物件
- 面試官:談談你對Mysql資料庫讀寫分離的瞭解,並且有哪些注意事項?面試MySql資料庫
- 面試官:談談你對SpringAOP的瞭解?請加上這些內容,絕對加分!面試Spring
- MySQL高頻面試題MySql面試題
- Java集合高頻面試題Java面試題
- Java高頻面試題---RabbitMQJava面試題MQ
- 【搞定面試官】談談你對JDK中Executor的理解?面試JDK
- 談談面試與面試題面試題
- MySQL 高頻面試題,都在這了MySql面試題
- 淺談Mysql索引MySql索引
- 漫談mysql索引MySql索引
- Java面試題:請談談Java中的volatile關鍵字?Java面試題
- 談談你對Promise的理解Promise
- 大白話聊聊Java併發面試問題之談談你對AQS的理解?【石杉的架構筆記】Java面試AQS架構筆記
- MySQL高頻面試題的靈魂拷問MySql面試題
- 【面試普通人VS高手系列】談談你對Seata的理解面試
- 面試精選01-談談你對Abp中模組的理解面試
- 高頻面試題面試題
- MySQL淺談(索引、鎖)MySql索引
- 【大廠面試06期】談一談你對Redis持久化的理解?面試Redis持久化
- 談談OKHttp的幾道面試題HTTP面試題
- 談談MYSQL索引是如何提高查詢效率的MySql索引
- java框架面試高頻問題(SpringMVC)Java框架面試SpringMVC
- 談談我對MySQL+PHP+Flex開發的見解MySqlPHPFlex
- 談談你對 Java 平臺的理解?“Java 是解釋執行”,這句話正確嗎?Java
- 談一談我所瞭解的HTTPSHTTP
- 簡單說幾個MySQL高頻面試題MySql面試題
- 第 15 題:談談你對迴流和重繪的理解?
- 深入瞭解MySQL的索引MySql索引