1、為什麼需要索引?
索引的出現是為了提高資料查詢的效率1、雜湊表
雜湊表是一種以鍵-值(key-value)儲存資料的結構,只要輸入待查詢的值即key,就可以找到其對應的值即 value。
雜湊的思路:把值放在陣列裡,用乙個雜湊函式把key換算成乙個確定的位置,然後把value放在陣列的這個位置
雜湊表增加資料是通過一種雜湊執行,先算出位置,然後在陣列中新增。所以增加資料快,因為不是有序的所以雜湊索引做區間查詢的速度是很慢的。
雜湊表結構: 適用於有等值查詢的場景2、有序陣列
在等值查詢和範圍查詢場景中的效能就都非常優秀
陣列就是按照遞增的順序儲存的。查詢用二分法就可以快速得到,時間複雜度是 o(log(n))。
往中間插入乙個記錄就必須得挪動後面所有的記錄,成本太高。
有序陣列索引適用於靜態儲存引擎3、搜尋樹
二叉搜尋樹的特點是:每個節點的左兒子小於父節點,父節點又小於右兒子。時間複雜度o(log(n))
樹可以有二叉,也可以有多叉。多叉樹就是每個節點有多個兒子,兒子之間的大小保證從左到右遞增。
二叉樹是搜尋效率最高的,但是實際上大多數的資料庫儲存卻並不使用二叉樹。原因是,索引不止存在記憶體中,還要寫到磁碟上。
為什麼不用二叉樹:一棵 100 萬節點的平衡二叉樹,樹高 20。一次查詢可能需要訪問 20 個數 據塊。在機械硬碟時代,從磁碟隨機讀乙個資料塊需要 10 ms 左右的定址時間。對於乙個 100 萬行的表,如果使用二叉樹來儲存,單獨訪問乙個行可能需要 20 個 10 ms 的時間,這個查詢太慢。
為了讓乙個查詢盡量少地讀磁碟,就必須讓查詢過程訪問盡量少的資料塊。就不應該使用二叉樹,而是要使用「n 叉」樹。這裡,「n 叉」樹中的「n」取決於資料塊的 大小。
n叉樹由於在讀寫上的效能優點,以及適配磁碟的訪問模式,已經被廣泛應用在資料庫引擎中。1、以 innodb 的乙個整數字段索引為例,這個n差不多是1200。這棵樹高是4的時候,可以存1200的3 次方個值差不多17億。考慮到樹根的資料塊總是在記憶體中的,乙個10億行的表上乙個整數字段的索引,查詢乙個值最多隻需要訪問3次磁碟。
2、索引組織表 在innodb中,表都是根據主鍵順序以索引的形式存放的。
3、innodb使用b+樹索引模型
4、索引型別分為主鍵索引和非主鍵索引
主鍵索引的葉子節點存的是整行資料。在innodb裡主鍵索引也被稱為聚簇索引 (clustered index)。
非主鍵索引的葉子節點內容是主鍵的值。在innodb裡非主鍵索引也被稱為二級索引 (secondary index)。5、主鍵索引和普通索引的查詢的區別
主鍵查詢方式==> 只需搜尋id 這顆b+樹
普通索引先搜尋索引樹,得到id 的值,再到id 索引搜尋一次 => 回表
基於非主鍵索引的查詢需要多掃瞄一棵索引樹。在應用中應該盡量使用主鍵查詢。
如果設計到分庫分表就需要考慮唯一id 可以使用雪花演算法生成乙個唯一id
普通的uuid 在底層查詢也是將字元轉化為ascii然後再去比較6、自增主鍵優缺點
主鍵長度越小,普通索引的葉子節點就越小,普通索引占用的空間也就越小。
自增主鍵的插入資料模式,符合遞增插入的場景。每次插入一條新記錄,都是追加操作,都不涉及到挪動其他記錄,也不會觸發葉子節點的**。
從效能和儲存空間方面考量,自增主鍵往往是更合理的選擇1、所在的資料頁已經滿了,根據b+樹的演算法,這時候需要申請乙個新的資料頁,然後挪動部分資料過去=> 頁**。
頁**操作影響資料頁的利用率2、資料刪除,利用率降低,將資料頁合併
Mysql 04 索引 序列
3.刪除索引 4.檢視索引 二 序列 參考資料 來加快查詢的技術很多,其中最重要的是索引。通常索引能夠快速提高查詢速度 索引是在mysql的儲存引擎層中實現的,而不是在服務層實現的。所以每種儲存引擎的索引都不一定完全相同,也不是所有的儲存引擎都支援所有的索引型別。mysql目前提供了一下4種索引 h...
MySql 05 筆記 索引
1 select from t where k between 3 and 5執行幾次搜尋樹?會掃瞄多少行?create table t id int primary key,k int notnull default0,s varchar 16 not null default index k k...
day04 筆記 java迴圈結構
筆記 1.分支結構 1 if結構 1條路 2 if.else結構 2條路 3 if.else if結構 多條路 4 switch.case結構 多條路 優點 效率高 結構清晰 缺點 整數 相等 break 跳出switch 2.迴圈 1 反覆執行一段相同或相似的 2 迴圈三要素 2.1 迴圈變數的初...