1. 程式人生 > >【索引】索引的介紹與優化

【索引】索引的介紹與優化

png spl 二級 隨機 birt 數據行 連續 記錄 code

1. 索引基礎

  索引:存儲引擎用於快速找到記錄的數據結構

1.1 索引類型

1.1.1 B+ Tree

  B+ 樹: 多路搜索樹

技術分享圖片

  B+樹能加快訪問數據速度, 不需要訪問全表來查詢數據,而是從根節點中進行搜索, 根節點中保存了子節點的指針(並且包含子節點的上限與下限),選擇正確的子節點進行查找,既可以找到對應值。

可以使用B-Tree 查詢類型:

  使用如下表說明查詢類型

Create Table People{
    f_name varchar(50) not null,
    l_name varchar(50) not null,
    birth date 
not null, gender enum(m,f) not null, key(f_name, l_name, birth) }
  1. 全值匹配: 和索引中所有列匹配(所有列有 f_name, l_name, birth), 如: 查找 f_name 為‘Allen’ l_name 為 ‘Cuba’ 生日是 ‘1990-01-01‘的
  2. 匹配最左前綴: 匹配所有的前幾列(一定要從左到右, 依次選,不能跳躍), 如 查找 f_name 為‘Allen’ l_name 為 ‘Cuba’ 的
  3. 匹配列前綴:匹配某一列值的開頭, 如 查找f_name 為 ‘Allen’ 並且 l_name 中第一個字為 ‘C’ 的人
  4. 匹配範圍值:用於查找 f_name 在 ‘Allen‘ 和 ‘Barrymore‘ 之間的

索引的限制:

  1. 如果不是從索引的最左列開始(第一列)則無法使用索引(如:無法查找生日為某一天的特定生日的人)
  2. 不能跳過索引中的列
  3. 如果查詢中某個列有範圍查詢,則右邊的索引都無法使用

哈希索引

  哈希索引采用Hash表實現, 只有精確匹配才有效, 存儲引擎為每一列添加一個索引列計算得到的索引值,並且不同的值得到的索引不一樣,hash存儲在索引中,也在hash表中保存指向每個數據行的指針

限制

  1. 索引自身只需要存儲 hash值,所以不能使用索引中的值來避免讀取行
  2. 不能排序(按照hash讀取的)
  3. 不支持匹配查找,只支持等值查找
  4. 存在hash沖突

全文索引

  一種特殊的索引,查找文中關鍵詞,而不是比較索引的值,類似於搜索引擎,需要註意:停用詞、詞幹和復數、布爾搜索等

1.2 索引優缺點

  • 減少了服務器需要掃描的數據量
  • 避免了排序和臨時表
  • 將隨機I/O改變為順序I/O

索引類別

唯一索引:加速查詢 + 列值唯一(null)

主鍵索引: 加速查詢 + 列值唯一(null)

組合索引:多列值構成索引

覆蓋索引:索引包含了查詢的所有列,查詢時候只需要執行一次查詢就可以得到結果數據

聚簇索引

葉子結點是數據而非數據指針(InnoDB)

優點:

  • 把數據保存在一起
  • 數據訪問快
  • 使用覆蓋索引可以直接找到主鍵值

缺點:

  • 插入速度依賴於插入速度
  • 更新代價高
  • 在表中插入新行,或者主鍵被更新需要移動時候,可能面臨頁分裂
  • 全表掃描變慢(行比較稀疏,或者頁分裂導致數據不連續)
  • 二級索引較大,在二級索引的葉子結點包含了主鍵的值, 需要再一次IO

  

    技術分享圖片

  非聚簇索引

    葉子結點為數據指針而非數據

技術分享圖片

  

InnoDB 和 myisam 對比

數據分布

InnoDB

  

技術分享圖片

myisam

技術分享圖片

  

【索引】索引的介紹與優化