1. 程式人生 > >5.索引簡介

5.索引簡介

直接 都是 其他 不一定 指向 更新 使用 操作 變化

索引是什麽:

  1.MySQL官方對索引的定義為:索引(Index) 是幫助MySQL高效獲取數據的數據結構

  2.可以理解為 “排好序的快速查找數據結構”

    索引是排好序的,能夠用於快速查找的數據結構,索引可以幫助我們兩點:

    1.對於需要排序的相關的命令,可以減輕cpu的負擔

    2.可以加快查詢速度,減少IO操作

      無索引,直接去讀表數據存放的磁盤塊,讀到數據緩沖區中再查找需要的數據。

      有索引,先讀入索引表,通過索引表直接找到所需數據的物理地址,並把數據讀入數據緩沖區中

  數據本身之外,數據庫還維護著一個滿足特定查找算法的數據結構,這些數據結構以某種方式指向數據

  這樣就可以在這些數據結構的基礎上實現高級查找算法,這種數據結構就是索引

  3.一般來說索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上

  4.我們平常所說的索引,如果沒有特別指明,都是指B樹(多路搜索樹,並不一定是二叉的)結構組織的索引

  其中聚集索引、次要索引、覆蓋索引,復合索引,前綴索引,唯一索引默認都是使用B+樹索引,統稱索引

  當然,除了B+樹這種類型的索引之外,還有哈希索引(hash index 等)

優勢:

  1.類似大學圖書館建書目索引,提高數據檢索的效率,降低數據庫的IO成本

  2.通過索引列隊數據進行排序,降低數據排序的成本,降低CPU的消耗

劣勢:

  1.實際上索引也是一張表,該表有主鍵 和 索引 兩個字段,並指向實體表的記錄,所以索引列也是要占空間的

  2.雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERTUPDATE和DELETE。

  因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引列額字段

  都會調整因為更新所帶來的鍵值變化後的索引信息

  3.索引只是提高效率的一個因素,如果你的MySQL有大數據量的表,

   就需要花時間研究建立最優秀的索引,或者優化查詢語句

MySQL索引分類: 

  1.單值索引 即一個索引只包含單個列,一個表可以有多個單值索引

  2.唯一索引 索引列的值必須唯一,但允許有空值

  3.復合索引 即一個索引包含多個列

基本語法:

  創建:

    CREATE [UNIQUE] INDEX indexName ON tableName(columnName(length))

    ALTER tableName ADD [UNIQUE] INDEX [indexName] ON (columnName(length))

  刪除:

    DROP INDEX [indexName] ON tableName

  查看:
    SHOW INDEX FROM tableName

  

MySQL索引結構:

  BTree索引 ---- 檢索原理 (後面一篇文章解釋)

  Hash索引

  full-text 全文索引

  R-Tree 索引 

哪些情況下需要創建索引

  1.主鍵自動建立唯一索引

  2.頻繁作為查詢條件的字段應該創建索引

  3.查詢中與其他表關聯的字段,外鍵關系建立索引

  4.Where 條件 裏用不到的字段不創建索引

  5.單值/復合 索引的選擇問題 (在高並發下傾向創建復合索引)

  6.查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度

  7.查詢中統計或者分組字段

哪些情況不要創建索引

  1.表記錄太少,記錄太少,用了索引也沒什麽效果

  2.經常增刪改的表,對表的更新,MySQL不僅要保存數據,還要保存一下索引文件

  3.數據重復且分布平均的表字段,因此應該只為最經常查詢和最經常排序的數據列建立索引

  註意:如果某個數據列包含許多重復的內容,為它建立索引就沒有太大的效果

  

 

5.索引簡介