索引能夠極大的提高資料檢索效率,也能夠改善排序分組操作的效能,但是我們不能忽略的乙個問題就是索引是完全獨立於基礎資料之外的一部分資料,更新資料會帶來的io量和調整索引所致的計算量的資源消耗。
是否需要建立索引?
幾點原則:
1、較頻繁的作為查詢條件的字段應該建立索引;
2、唯一性太差的字段不適合單獨建立索引,即使頻繁作為查詢條件;
3、更新非常頻繁的字段不適合建立索引;
4、不會出現在where子句中的字段不該建立索引;
我們應該 合理設計並利用索引。下面是索引的一些從原理層面的介紹,更細緻的介紹在我的另一篇博文上:
1)b-tree索引
一般來說,mysql中的b-tree索引的物理檔案大多都是以balancetree的結構來儲存的,也就是所有實際需要的資料都存放於tree的leafnode,而且到任何乙個leafnode的最短路徑的長度都是完全相同的,所以我們大家都稱之為b-tree索引當然,可能各種資料庫(或mysql的各種儲存引擎)在存放自己的b-tree索引的時候會對儲存結構稍作改造。如innodb儲存引擎的b-tree索引實際使用的儲存結構實際上是b+tree,也就是在b-tree資料結構的基礎上做了很小的改造,在每乙個leafnode上面出了存放索引鍵的相關資訊之外,還儲存了指向與該leafnode相鄰的後乙個leafnode的指標資訊,這主要是為了加快檢索多個相鄰leafnode的效率考慮。
2)hash索引
hash索引在mysql中使用的並不是很多,目前主要是memory儲存引擎使用,而且在memory儲存引擎中將hash索引作為預設的索引型別。所謂hash索引,實際上就是通過一定的hash演算法,將需要索引的鍵值進行hash運算,然後將得到的hash值存入乙個hash表中。然後每次需要檢索的時候,都會將檢索條件進行相同演算法的hash運算,然後再和hash表中的hash值進行比較並得出相應的資訊。
hash索引僅僅只能滿足「=」,「in」和「<=>」查詢,不能使用範圍查詢;
hash索引無法被利用來避免資料的排序操作;
hash索引不能利用部分索引鍵查詢;
hash索引在任何時候都不能避免表掃面;
hash索引遇到大量hash值相等的情況後效能並不一定就會比b-tree索引高;
3)full-text索引
full-text索引也就是我們常說的全文索引,目前在mysql中僅有myisam儲存引擎支援,而且也並不是所有的資料型別都支援全文索引。目前來說,僅有char,varchar和text這三種資料型別的列可以建full-text索引。
資料庫優化之MySQL優化 二 索引優化
索引優化 分類 普通索引,唯一索引,主鍵索引,聯合索引 問題 如何選擇合適的列建立索引?1 在where從句,group by從句,order by從句,on從句中出現的列 2 索引字段越小越好 3 離散度大的列放到聯合索引的前面 select from payment where staff id...
mysql資料庫優化索引 mysql資料庫索引調優
一 mysql索引 1 磁碟檔案結構 innodb引擎 frm格式檔案儲存表結構,ibd格式檔案儲存索引和資料。myisam引擎 frm格式檔案儲存表結構,myi格式檔案儲存索引,myd格式檔案儲存資料 2 mysql資料庫資料範問原理 innodb btree 1 ibd檔案中主鍵構建b tree...
mysql資料庫優化之索引優化
一 如何選擇合適的列建立索引 1 一般會選擇在where從句中,group by從句中,order by從句中 join on 從句中,建立索引,在特殊情況下select 從句中,所出的列,進行索引,當乙個索引包含了查詢中的所有列,那麼稱之為這樣的索引為覆蓋索引,當我們的查詢執行的頻率非常高,並且索...