【一】索引
基本概述:索引是數據庫管理系統中一個有序的數據結構,協助快速查詢更新數據庫表中的數據
索引類型:普通索引,唯一索引(唯一),主鍵索引(唯一非空),全文索引(解決like效率低的索引)
數據結構:二叉查找樹,查找效率受到其深度的影響,極端情況下會行程單鏈表的結構,查詢效率慢,之後演變成平衡二叉查找樹,通過左右旋的操作使得左右子樹的深度相差不大,平衡二叉樹每個節點如果只存儲一條數據大大浪費空間,所以最終變爲多路平衡查找樹,即所謂的B Tree,MySql底層的數據結構是加強版的B TREE即:B+Tree
B TREE結構圖
B+TREE結構圖
B+TREE一路能夠存儲多少條數據
一個節點16k,大約1024*16個字節,引用+鍵值大約16個字節,所以一個節點可以分1024路,葉子節點存儲數據,一條數據約1k,可以存儲16條數據,所以一路存儲的數據共1024*1024*16=16777216,大約一千多萬條數據,節省了與磁盤的io操作,樹的深度也就在2-3之間
b+tree的特點
1、b tree能解決的問題,b+tree都能解決
2、掃庫掃表能力更強
3、磁盤讀寫能力更強
4、排序能力更強
5、效率更加穩定:因爲數據都是存儲在葉子節點上,保證查詢數據,每次的io效率是穩定的
索引方式
1、B+TREE
2、Hash:採取鍵值對模式,時間複雜度永遠是0(1)查詢快,缺點是無序的,只能等值查詢,向> <這種範圍查詢是搞不定的 ;同時也會出現hash碰撞的問題
InnoDb主鍵索引,其他索引(輔助索引) :Innodb是以主鍵索來組織數據存放的
如果沒有定義主鍵索引的話,它會找一個不包含null值得唯一字段作爲主鍵索引
如果沒有這種字段,它會選擇隱含得rowid作爲主鍵索引
索引的適用原則
離散度越高建索引越好
聯合索引的話滿足最左匹配原則
覆蓋索引,指查詢具體的字段索引數據,不需要再走主鍵索引,猶如上圖的輔助索引,只不過不需要再查詢一遍主鍵索引拉
1、在用於where判斷order排序和join的on字段上創建索引
2、索引的個數不要過多:索引創建過多消耗空間
3、區分度低的字段不要建立索引,比如性別
4、頻繁更新的值,不要作爲主鍵,因爲會發生數據結構的調整
5、聯合索引把離散度高的字段放在前面
6、創建了聯合索引之後,不需要再創建單列的索引
什麼時候用不到索引?
1、索引列上適用函數計算,replace,sum,count
2、字符串不加引號,出現隱式轉換 id字段是字符串類型,sql --》where id=1不走索引,where id ='2' 走索引
3、like條件前面帶%。 where name like 'wang%'走索引 where name like '%wang' 不走索引
4、負向查詢能用到索引嗎 <> != not in? where name <> 'wang'走索引