mysql基礎_索引

蜀道,難發表於2023-05-19

介紹

“索引”是為了能夠更快地查詢資料。比如一本書的目錄,就是這本書的內容的索引,讀者可以透過在目錄中快速查詢自己想要的內容,然後根據頁碼去找到具體的章節。

優缺點

優勢:以快速檢索,減少I/O次數,加快檢索速度;根據索引分組和排序,可以加快分組和排序;

劣勢:索引本身也是表,因此會佔用儲存空間。索引的維護和建立需要時間成本,這個成本隨著資料量增大而增大;構建索引會降低資料表的修改操作(刪除,新增,修改)的效率,因為在修改資料表的同時還需要修改索引表

何時新增索引

我們在下面三種情況下會考慮給欄位新增索引:

1.資料量龐大

毋庸置疑,資料量龐大時新增索引明顯能夠提升查詢效率

2.欄位作為查詢條件

該欄位老是出現在where語句後面,老是被掃描。

3.該欄位很少進行插入,修改,刪除操作

因為做這些操作,索引需要重新排序

注意:1.主鍵上,以及unique欄位上都會自動新增索引的(所以查詢的時候儘量透過有主鍵或者帶有unique欄位進行查詢)

​ 2.建議不要隨意新增索引,因為索引也是需要維護的,太多的話反而會降低系統的效能

索引語法

建立索引

create index student_name_index on student(name);

這條命令的意思是:在學生表student的name欄位上建立索引,名字是student_name_index,使用的時候結合自己的表來替換對應的東西。

刪除索引

drop index student_name_index on student;

這條命令的意思是:將學生表student上的student_name_index索引物件刪除,使用的時候結合自己的表來替換對應的東西。

是否使用索引檢索

舉例:

對一張comment表的content欄位進行查詢,發現查詢出來的行數是19行,而這張表的行數也是19行,沒有使用索引檢索,如下:

explain select * from comment where content = '很好';

image-20230509000900955

給該欄位建立索引,然後再進行檢視。

image-20230509000837646

有使用索引進行查詢,查詢出來的條數是兩條(因為我這個表裡content欄位有兩條記錄是“很好”。)

索引的分類

單一索引:顧名思義,就是在一個欄位上新增索引。

語法跟上面說的一樣,這裡不重複。

主鍵索引:這是在主鍵上新增索引,建表的時候透過 PRIMARY KEY(欄位) 這種方式來設定主鍵,同時自動新增索引,注意,一張表只能有一個主鍵。

唯一索引:與單一索引類似,索引列的值必須唯一,允許有空值。

create unique index 索引的名字 on 表名(欄位);

組合索引:兩個或者更多的欄位新增索引

alter table 表名 add index 索引的名字(欄位,欄位,欄位);

例如:

image-20230509124926486

索引失效的時候

%開頭

欄位採用模糊查詢的時候是以“%”開頭了,這種情況要儘量避免,如下圖,查詢還是全部查出來了。

image-20230509131653140

or兩邊有一邊沒有索引

查詢的時候,使用or。使用or那麼要求or兩邊的條件欄位都要有索引,才會走索引,如果其中一邊有一個欄位沒有索引,那麼另一個欄位上的索引也會失效,如下圖。

image-20230518233743577

索引參與運算

在查詢條件中標記為索引的列參與運算,索引就失效。

image-20230518234409884

索引使用函式

在查詢條件中標記為索引的列使用函式,索引就失效了。

image-20230518234751351

沒有使用最左側的列查詢

使用複合索引的時候,查詢時沒有使用最左側的列進行查詢,索引失效。

image-20230519000710761

面試題

1.索引的原理

MySQL 中的索引是透過 B+ 樹實現的。B+ 樹是⼀種多叉樹,它可以將資料按照⼀定的順序組織起來,從而提高查詢效率。

B+ 樹的所有資料都儲存在葉子節點上,而非葉子節點只儲存索引,這樣可以提高資料查詢效率。B+ 樹的葉子節點之間使用指標相連,這樣可以實現區間查詢,也就是說,可以快速定位某個區間內的資料。

在 MySQL 中,B+ 樹的實現主要是透過 InnoDB 儲存引擎來實現的。InnoDB 儲存引擎中的索 引主要有聚簇索引和輔助索引兩種型別,聚簇索引是根據主鍵建立的索引,而輔助索引是根據非主鍵列建立的索引。

對於輔助索引,MySQL 中會同時建立⼀個對應的聚簇索引,這樣可以提高查詢效率。

2.覆蓋索引和聯合索引是什麼?講⼀下索引的最左字首匹配原則。

覆蓋索引和聯合索引是資料庫中常見的兩種索引型別。 覆蓋索引是指⼀個包含了所有查詢需要的列的索引,查詢時可以直接從索引中取到需要的資料,而不需要再回到表中查詢,從而可以提高查詢效率。 聯合索引是指使用多個列組合起來作為⼀個索引,可以同時查詢多個列,以提高查詢效率。聯合索引可以包含多個列,但是查詢時只能使用字首列進行查詢,即只有在查詢中使用了聯合索引的前幾個列,才能利用聯合索引進行查詢。如果查詢中沒有使用字首列,那麼聯合索引就不能發揮作用,需要使用單獨的索引或全表掃描。最左字首匹配原則是指如果⼀個聯合索引包含了多個列,那麼在查詢時只能使用前面的列進行匹配。 例如,⼀個聯合索引包含了 A、B、C 三列,那麼查詢時只能使用A、AB 或 ABC 進行匹配, 而不能只使用 B 或 C 進行匹配。這是因為如果查詢時使用的列不是最左字首列,那MySQL 就⽆法使⽤索引進行查詢,會導致全表掃描,從而降低查詢效率。 在實際的應用中,覆蓋索引和聯合索引可以結合使用,以提高查詢效率。同時,使用最左字首匹配原則可以讓我們更加合理地設計索引,從而提高查詢效能。

相關文章