【索引】索引的介紹與優化
阿新 • • 發佈:2019-04-18
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 datenot null, gender enum(‘m‘,‘f‘) not null, key(f_name, l_name, birth) }
- 全值匹配: 和索引中所有列匹配(所有列有 f_name, l_name, birth), 如: 查找 f_name 為‘Allen’ l_name 為 ‘Cuba’ 生日是 ‘1990-01-01‘的
- 匹配最左前綴: 匹配所有的前幾列(一定要從左到右, 依次選,不能跳躍), 如 查找 f_name 為‘Allen’ l_name 為 ‘Cuba’ 的
- 匹配列前綴:匹配某一列值的開頭, 如 查找f_name 為 ‘Allen’ 並且 l_name 中第一個字為 ‘C’ 的人
- 匹配範圍值:用於查找 f_name 在 ‘Allen‘ 和 ‘Barrymore‘ 之間的
索引的限制:
- 如果不是從索引的最左列開始(第一列)則無法使用索引(如:無法查找生日為某一天的特定生日的人)
- 不能跳過索引中的列
- 如果查詢中某個列有範圍查詢,則右邊的索引都無法使用
哈希索引
哈希索引采用Hash表實現, 只有精確匹配才有效, 存儲引擎為每一列添加一個索引列計算得到的索引值,並且不同的值得到的索引不一樣,hash存儲在索引中,也在hash表中保存指向每個數據行的指針
限制
- 索引自身只需要存儲 hash值,所以不能使用索引中的值來避免讀取行
- 不能排序(按照hash讀取的)
- 不支持匹配查找,只支持等值查找
- 存在hash沖突
全文索引
一種特殊的索引,查找文中關鍵詞,而不是比較索引的值,類似於搜索引擎,需要註意:停用詞、詞幹和復數、布爾搜索等
1.2 索引優缺點
- 減少了服務器需要掃描的數據量
- 避免了排序和臨時表
- 將隨機I/O改變為順序I/O
索引類別
唯一索引:加速查詢 + 列值唯一(null)
主鍵索引: 加速查詢 + 列值唯一(null)
組合索引:多列值構成索引
覆蓋索引:索引包含了查詢的所有列,查詢時候只需要執行一次查詢就可以得到結果數據
聚簇索引
葉子結點是數據而非數據指針(InnoDB)
優點:
- 把數據保存在一起
- 數據訪問快
- 使用覆蓋索引可以直接找到主鍵值
缺點:
- 插入速度依賴於插入速度
- 更新代價高
- 在表中插入新行,或者主鍵被更新需要移動時候,可能面臨頁分裂
- 全表掃描變慢(行比較稀疏,或者頁分裂導致數據不連續)
- 二級索引較大,在二級索引的葉子結點包含了主鍵的值, 需要再一次IO
非聚簇索引
葉子結點為數據指針而非數據
InnoDB 和 myisam 對比
數據分布
InnoDB
myisam
【索引】索引的介紹與優化