對MySQL中索引的一些理解

2021-08-31 03:36:54 字數 2181 閱讀 4477

什麼是索引?

有人說「索引就是一本書的目錄,當我們想要快速的找到某個點時就可以通過目錄直接跳到相應地方」,這只是乙個通俗的說法,索引的定義是:索引是為了加速對錶中資料行的檢索而建立的乙個分散儲存

的資料結構。

它是一種資料結構而且是b+tree結構。

為什麼要建立索引?

正確的建立合適的索引會提高資料庫查詢的效率,如何理解建立索引可以提高查詢的效率呢?

我們通常對資料表的檢索方式是根據你的檢索條件對全表進行掃瞄,逐步獲取結果集。如果在某個字段建立索引,那麼查詢時會去索引列表中一次定位到特定值的那一行,因此索引可以大大減少儲存引擎所需要掃瞄的資料量。

這樣說還是有些籠統。我們可以想一下,通常可以使用什麼什麼樣結構來提高查詢效率呢?很容易會想到樹型結構,二叉樹,平衡二叉樹等,還有更高階的b樹,b樹又稱為多路平衡二叉樹,由於他有多路分叉,所以高度也就更低,因此他的查詢效率也要更高。

而索引的資料結構為b+樹,也就是加強版的b樹

他和b樹的區別在於1.關鍵字是閉合區間 2.他的非葉子節點不存資料,只儲存關鍵字和和子節點的應用 3.關鍵字對應資料儲存在葉子節點中。4.葉子節點順序排列,並且相鄰節點可以順序引用。

b+樹的好處顯而易見:它擁有b樹的同樣的優勢,同時掃瞄庫,表的能力也要更強、他優化了磁碟的讀寫效能,他一次io載入的資料比b樹更多,讀寫的次數更少,所以讀寫能力更強,而且b+樹的排序能力更強,b+樹的結構天然就在葉子節點排好序了。而且由於只用葉子節點存放資料,所以查詢效率更加穩定。

mysql索引表現形式有兩種——myisam、innodb

myisam有三個檔案myisam.frm——儲存表結構、myisam.myi——存放索引、myisam.myd——存放資料

innodb有兩個檔案innodb.frm——儲存表結構、innodb.ibd——這裡有所不同,他是將索引和資料放在一起的,他是以主鍵為索引來組織資料的儲存的。

主鍵索引:以主鍵為索引來組織資料的儲存,由於主鍵中所有值都唯一,所以實現對資料的快速訪問

聚集索引:資料表行中資料的物理順序與邏輯(索引)順序相同。

什麼時候需要建立索引

當你需要對索引列中的資料進行反覆的訪問時,就可以建立索引。索引占用磁碟空間,並且降低新增、刪除和更新行的速度。

索引列:可以基於資料庫表中的單列或多列建立索引。多列索引使您可以區分其中一列可能有相同值的行。當然了,如果你的表很小的化就沒必要建立索引了。

如何確定索引的有效性呢?

通過檢查where和join子句,對子句的每一列都確保為索引選擇的物件。

試驗新索引確定查詢效能

避免但張表有多個索引

避免包共享列的重疊索引,比如你建立乙個以姓名,年齡兩列的索引,就沒必要在建立乙個姓名索引

確定表中某列資料的分散性,即看列中某唯一值的數量與錶行數對比,資料值越是唯一,越適合建立索引。

建立方式

針對where或join子句的相關列建立索引

select * from t_student where no = '12345';

這個時候就在no列建立索引:create index student_no on t_student (no);

如果這個時候我有多個條件選擇呢?比如 select * from t_student where no ='12345' and age = '20';

此時可以create index student_no_age on t_student (no,age); 

那麼如何知道資料庫會不會用這些索引呢?

可以用explain + 查詢語句 就可以得到乙個結構

例:

如果用了索引,在possible_k列中可以看出,正常沒有索引的查詢type顯示為all,也就是全表查詢。

mysql 中對索引的一些簡單理解

mysql中索引的分類 mysql索引結構 哪些情況下需要建索引 哪些情況下不需要建立索引 在面試的時候面試官經常會問這個問題?1.你可以簡單的理解為 排好序的快速查詢的資料結構 2.索引本身很大,不可能全部放在記憶體中,因此索引以索引檔案的形式放在磁碟上!3.平時說的索引如果沒有特殊說明就是指bt...

Mysql mysql索引的一些理解

1.索引 索引是幫助mysql高效獲取資料的排好序的資料結構 2.索引的資料結構 col1 col2134 277491 522689 723上面 假設是mysql資料庫中一張表,我們執行select from t where t.col1 6,毫無疑問需要執行6次和磁碟i o,才能找到我們需要的值...

對java中static的一些理解

一 static成員變數和非static成員變數的區別 1 記憶體中的位置不同 ststic的成員變數存放在全域性變數區,只有乙份。非static的成員變數在物件例項化時隨著物件儲存在堆中,每個物件都有特定的乙個。2 使用方法 static成員變數既可以被類名呼叫也可以被物件呼叫,非static成員...