資料庫索引高頻面試題(最新版)

2021-10-13 07:58:16 字數 3272 閱讀 4649

mysql的索引是面試中的高頻題目,將常見的索引面試題目總結了一下,如果有幫到你可以點讚收藏呦。

推薦閱讀:什麼是索引?

索引的優缺點?

優點:

缺點:

索引的資料結構?

索引的資料結構主要有b+樹和雜湊表,對應的索引分別為b+樹索引和雜湊索引。innodb引擎的索引型別有b+樹索引和雜湊索引,預設的索引型別為b+樹索引。

從上圖可以看出 ,因為b+樹具有有序性,並且所有的資料都存放在葉子節點,所以查詢的效率非常高,並且支援排序和範圍查詢。

b+樹的索引又可以分為主索引和輔助索引。其中主索引為聚簇索引,輔助索引為非聚簇索引。聚簇索引是以主鍵作為b+ 樹索引的鍵值所構成的b+樹索引,聚簇索引的葉子節點儲存著完整的資料記錄;非聚簇索引是以非主鍵的列作為b+樹索引的鍵值所構成的b+樹索引,非聚簇索引的葉子節點儲存著主鍵值。所以使用非聚簇索引進行查詢時,會先找到主鍵值,然後到根據聚簇索引找到主鍵對應的資料域。上圖中葉子節點儲存的是資料記錄,為聚簇索引的結構圖,非聚簇索引的結構圖如下:

上圖中的字母為資料的非主鍵的列值,假設要查詢該列值為b的資訊,則需先找到主鍵7,在到聚簇索引中查詢主鍵7所對應的資料域。

hash索引和b+樹的區別?

因為兩者資料結構上的差異導致它們的使用場景也不同,雜湊索引一般多用於精確的等值查詢,b+索引則多用於除了精確的等值查詢外的其他查詢。在大多數情況下,會選擇使用b+樹索引。

索引的型別有哪些?

mysql主要的索引型別主要有fulltext,hash,btree,rtree。

索引的種類有哪些?

b樹和b+樹的區別?

b樹和b+樹最主要的區別主要有兩點:

資料庫為什麼使用b+樹而不是b樹?

那在什麼情況適合使用b樹呢,因為b樹的內部節點也可以儲存值,所以可以把一些頻繁訪問的值放在距離根節點比較近的地方,這樣就可以提高查詢效率。綜上所述,b+樹的效能更加適合作為資料庫的索引。

什麼是聚簇索引,什麼是非聚簇索引?

聚簇索引和非聚簇索引最主要的區別是資料和索引是否分開儲存

在innodb儲存引擎中,預設的索引為b+樹索引,利用主鍵建立的索引為主索引,也是聚簇索引,在主索引之上建立的索引為輔助索引,也是非聚簇索引。為什麼說輔助索引是在主索引之上建立的呢,因為輔助索引中的葉子節點儲存的是主鍵。

在myisam儲存引擎中,預設的索引也是b+樹索引,但主索引和輔助索引都是非聚簇索引,也就是說索引結構的葉子節點儲存的都是乙個指向資料行的位址。並且使用輔助索引檢索無需訪問主鍵的索引。

非聚簇索引一定會進行回表查詢嗎?

上面是說了非聚簇索引的葉子節點儲存的是主鍵,也就是說要先通過非聚簇索引找到主鍵,再通過聚簇索引找到主鍵所對應的資料,後面這個再通過聚簇索引找到主鍵對應的資料的過程就是回表查詢,那麼非聚簇索引就一定會進行回表查詢嗎?

答案是不一定的,這裡涉及到乙個索引覆蓋的問題,如果查詢的資料再輔助索引上完全能獲取到便不需要回表查詢。例如有一張表儲存著個人資訊包括id、name、age等字段。假設聚簇索引是以id為鍵值構建的索引,非聚簇索引是以name為鍵值構建的索引,select id,name from user where name = 'zhangsan';這個查詢便不需要進行回表查詢因為,通過非聚簇索引已經能全部檢索出資料,這就是索引覆蓋的情況。如果查詢語句是這樣,select id,name,age from user where name = 'zhangsan';則需要進行回表查詢,因為通過非聚簇索引不能檢索出age的值。那應該如何解決那呢?只需要將索引覆蓋即可,建立age和name的聯合索引再使用select id,name,age from user where name = 'zhangsan';進行查詢即可。

所以通過索引覆蓋能解決非聚簇索引回表查詢的問題。

索引的使用場景有哪些?

索引的設計原則?

如何對索引進行優化?

對索引的優化其實最關鍵的就是要符合索引的設計原則和應用場景,將不符合要求的索引優化成符合索引設計原則和應用場景的索引。

除了索引的設計原則和應用場景那幾點外,還可以從以下兩方面考慮。

索引的使用場景、索引的設計原則和如何對索引進行優化可以看成乙個問題。

如何建立/刪除索引?

建立索引:

刪除索引:

使用索引查詢時效能一定會提公升嗎?

不一定,前面在索引的使用場景和索引的設計原則中已經提到了如何合理地使用索引,因為建立和維護索引需要花費空間和時間上的代價,如果不合理地使用索引反而會使查詢效能下降。

什麼是字首索引?

字首索引是指對文字或者字串的前幾個字元建立索引,這樣索引的長度更短,查詢速度更快。

使用場景:字首的區分度比較高的情況下。

建立字首索引的方式

alter table table_name add key(column_name(prefix_length));

這裡面有個prefix_length引數很難確定,這個引數就是字首長度的意思。通常可以使用以下方法進行確定,先計算全列的區分度

select count(distinct column_name) / count(*) from table_name;

然後在計算字首長度為多少時和全列的區分度最相似。

select count(distinct left(column_name, prefix_length)) / count(*) from table_name;

不斷地調整prefix_length的值,直到和全列計算出區分度相近。

什麼是最左匹配原則?

最左匹配原則:從最左邊為起點開始連續匹配,遇到範圍查詢(、between、like)會停止匹配。

例如建立索引(a,b,c),大家可以猜測以下幾種情況是否用到了索引。

索引在什麼情況下會失效?

在上面介紹了幾種不符合最左匹配原則的情況會導致索引失效,除此之外,以下這幾種情況也會導致索引失效。

資料庫高頻面試題

關係型和非關係型資料庫的區別 各自優點 常用sql語句 ddl,dml,dcl,tcl 資料庫中join的型別與區別 inner join,outer join,cross join,natural join,self join 注意適用場景和sql語句的編寫 資料庫的索引型別 聚集索引和非聚集索引...

2023年最新版MySQL面試題(一)

一 為什麼要使用資料庫 1.資料儲存在記憶體 優點 訪問速度快 缺點 資料不能永久儲存 2.資料儲存在檔案 優點 資料永久儲存 缺點 速度比記憶體操作慢,頻繁的io操作 查詢資料不方便。3.資料儲存在資料庫 資料永久儲存 使用sql語句,查詢方便效率高 管理資料方便。二 什麼是sql?定義 結構化查...

2023年最新版MySQL面試題(四)

一 什麼是儲存過程?有哪些優缺點?儲存過程是乙個預編譯的sql語句,優點是允許模組化的設計,就是說只需要建立一次,以後在該程式中就可以呼叫多次。如果某次操作需要執行多次sql,使用儲存過程比單純sql語句執行要快。優點儲存過程是預編譯過的,執行效率高。安全性高,執行儲存過程需要有一定許可權的使用者。...