什麼是索引?
有人說「索引就是一本書的目錄,當我們想要快速的找到某個點時就可以通過目錄直接跳到相應地方」,這只是乙個通俗的說法,索引的定義是:索引是為了加速對錶中資料行的檢索而建立的乙個分散儲存
的資料結構。
它是一種資料結構而且是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成員...