1、mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構。
可以得到索引的本質:索引是資料結構。
你可以簡單理解為「排好序的快速查詢資料結構
2、面臨問題
索引的目的在於提高查詢效率,可以模擬字典,
如果要查「mysql」這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。
如果沒有索引,那麼你可能需要a----z
3、細節
在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。
一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上
優勢:檢索和排序
劣勢:降低表的更新速率、索引表占用空間
4、mysql索引結構
btree索引(每個磁碟快中含有資料、向下的指標、鍵值-表中的主鍵)
【初始化介紹】
一顆b樹,淺藍色的塊我們稱之為乙個磁碟塊,可以看到每個磁碟塊包含幾個資料項(深藍色所示)、指向深藍色資料的指標和指標(黃色所示),
如磁碟塊1包含資料項17和35、指向這兩個資料的指標和指標p1、p2、p3,
p1表示小於17的磁碟塊,p2表示在17和35之間的磁碟塊,p3表示大於35的磁碟塊。
【查詢過程】
如果要查詢資料項29,那麼首先會把磁碟塊1由磁碟載入到記憶體,此時發生一次io,在記憶體中用二分查詢確定29在17和35之間,鎖定磁碟塊1的p2指標,記憶體時間因為非常短(相比磁碟的io)可以忽略不計,通過磁碟塊1的p2指標的磁碟位址把磁碟塊3由磁碟載入到記憶體,發生第二次io,29在26和30之間,鎖定磁碟塊3的p2指標,通過指標載入磁碟塊8到記憶體,發生第三次io,同時記憶體中做二分查詢找到29,結束查詢,總計三次io。
b+tree索引(沒有儲存實際的資料,只有走到葉子結點才能找到資料,所以能儲存向下的指標更多了,相同多的資料,b+樹層數更低,io次數更少的情況下,更容易檢索到資料)
思考:為什麼說b+樹比b-樹更適合實際應用中作業系統的檔案索引和資料庫索引?
1) b+樹的磁碟讀寫代價更低
b+樹的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對b 樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相對來說io讀寫次數也就降低了。
2) b+樹的查詢效率更加穩定
由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每乙個資料的查詢效率相當。
5、聚簇索引和非聚簇索引
左側的索引就是聚簇索引,因為資料行在磁碟的排列和索引排序保持一致。
聚簇索引一般情況下就是該錶的主鍵,按照聚簇索引排列順序,查詢顯示一定範圍資料的時候,由於資料都是緊密相連,資料庫不不用從多個資料塊中提取資料,所以節省了大量的io操作。
當建立表時沒有顯示定義主鍵時.
1 首先判斷表中是否有非空的整形唯一索引,如果有,則該列為主鍵(這時候可以使用 select _rowid from table 查詢到主鍵列).
2 如果沒有符合條件的則會自動建立乙個6位元組的主鍵(該主鍵是查不到的).
注意:聚簇索引主鍵的插入速度要比非聚簇索引主鍵的插入速度慢很多。相比之下,聚簇索引適合排序,非聚簇索引(也叫二級索引)不適合用在排序的場合。
因為聚簇索引本身已經是按照物理順序放置的,排序很快。非聚簇索引則沒有按序存放,需要額外消耗資源來排序。
當你需要取出一定範圍內的資料時,用聚簇索引也比用非聚簇索引好。
另外,二級索引需要兩次索引查詢,而不是一次才能取到資料,因為儲存引擎第一次需要通過二級索引找到索引的葉子節點,從而找到資料的主鍵,然後在聚簇索引中用主鍵再次查詢索引,再找到資料。
6、索引分類
單值索引
即乙個索引只包含單個列,乙個表可以有多個單列索引
唯一索引
索引列的值必須唯一,但允許有空值
主鍵索引
設定為主鍵後資料庫會自動建立索引,innodb為聚簇索引
復合索引
即乙個索引包含多個列
7、索引sql
建立:create [unique ] index [indexname] on table_name(column))
刪除:drop index [indexname] on mytable;
檢視:show index from table_name
8、建索引情況
說明:mysql只會選擇最好的乙個索引使用,就算給所有字段建立了單值索引,mysql只會使用乙個。所以最好情況是建立乙個組合索引
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...