彙集索引與非彙集索引

彙集(clustered)索引,也叫聚簇索引。性能

  • 定義:數據行的物理順序與列值(通常是主鍵的那一列)的邏輯順序相同,一個表中只能擁有一個彙集索引。
  • 注:第一列的地址表示該行數據在磁盤中的物理地址,
    • 後面三列纔是咱們SQL裏面用的表裏的列,其中id是主鍵,創建了彙集索引

建立彙集索引

  • 若是不建立索引,系統會自動建立一個隱含列做爲表的彙集索引。
    • 注意:SQL Sever默認主鍵爲彙集索引,也能夠指定爲非彙集索引,
    • 而MySQL裏主鍵就是彙集索引

非彙集索引

  • 定義:該索引中索引的邏輯順序與磁盤上行的物理存儲順序不一樣,
    • 一個表中能夠擁有多個非彙集索引
  • 除了彙集索引之外的索引都是非彙集索引
    • 只是人們想細分一下非彙集索引,分紅普通索引惟一索引全文索引
  • 非彙集索引就像新華字典的偏旁字典,他結構順序與實際存放順序不必定一致
  • 非彙集索引的二次查詢問題

    • 非彙集索引葉節點仍然是索引節點
      • 只是有一個指針指向對應的數據塊,此若是使用非彙集索引查詢,
    • 而查詢列中包含了其餘該索引沒有覆蓋的列,
      • 那麼他還要進行第二次的查詢,查詢節點上對應的數據行的數據。(回表)
    • 若是在數據量不大的狀況下,
      • SQL Server頗有可能不會使用非彙集索引進行查詢,
      • 而是使用匯集索引進行查詢,即使須要掃描整個彙集索引,效率也比使用非彙集索引效率要高

如何解決非彙集索引的二次查詢問題

  • 複合索引(覆蓋索引)

總結與使用心得

  • 使用匯集索引的查詢效率要比非彙集索引的效率要高,
    • 可是若是須要頻繁去改變彙集索引的值,
      • 寫入性能並不高,由於須要移動對應數據的物理位置。
  • 非彙集索引在查詢的時候能夠的話就避免二次查詢,這樣性能會大幅提高。
  • 不是全部的表都適合創建索引,
    • 只有數據量大表才適合創建索引,且創建在選擇性高的列上面性能會更好。
相關文章
相關標籤/搜索