關於資料庫索引,必須掌握的知識點

2022-07-04 13:00:14 字數 3218 閱讀 7692

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),大家可以猜測以下幾種情況是否用到了索引。

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

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

必須掌握的13個MySQL索引知識點

問題1 什麼是資料庫索引?資料庫索引是資料庫系統中乙個重要的概念,索引也叫做 key 是一種用於提公升資料庫查詢效率的資料結構,我們可以把索引理解成一本書的目錄,通過目錄我們可以快速找到對應章節的內容,同樣的,通過資料庫索引,我們可以快速找到資料表中對應的記錄。總而言之,索引就像給資料表建了乙個目錄...

考研資料結構必須掌握的知識點

時間複雜度判斷理論 o 1 o log2 n o n o n log2 n o n 2 o n k o 2 n 空間複雜度判斷理論 屬性大小 char unsigned char signed char 1個位元組 short int unsigned short int signed int 2個...

MySQL資料庫索引知識點總結

1.mysql資料庫索引都有哪些資料結構 b 和hash 2.聊下hash hash查詢是把key通過hash生成下標然後獲取對應的值,它的主要特點是快速精確查詢,但是不支援範圍查詢。如果要是做成索引,速度是很慢的,要全部掃瞄。3.hash表在那些場景比較適合 等值查詢的場景,就只有kv key,v...