索引是幫助MySQL高效獲取數據的排好序的數據結構
-
主鍵和unique約束的字段會自動添加索引(根據主鍵查詢效率較高,儘量根據主鍵檢索)
-
索引操作
- 添加索引
create index 索引名 on 表名(字段名)
; - 刪除索引
drop index 索引名 on 表名(字段名)
;
- 添加索引
-
索引分類:
- 單一索引:給單個字段添加索引
- 聯合索引:多個字段聯合起來添加一個索引
- 主鍵索引:主鍵上會自動添加索引
- 唯一索引:unique約束的字段會自動添加索引
-
索引失效的情況:
模糊查詢時,第一個查詢字符是不確定值(’%‘或’_’)時,索引失效
select name from stu where name like '%e%';
索引失效select name from stu where name like 'h%';
索引有效
數據結構
-
索引數據結構
- 二叉樹
- 紅黑樹
- Hash表
- B-Tree樹
-
紅黑樹結構:
-
Hash表:效率高,但是無法支持範圍查找
-
B-Tree結構
- 葉節點具有相同的深度,葉節點的指針爲空
- 所有索引元素不重複
- 節點中的數據索引從左到右遞增排列
-
B+Tree (B-Tree變種)
-
非葉子節點不存儲data,只存儲冗餘索引,可以存放更多的索引
-
葉子節點包含所有的索引字段
-
葉子節點用指針連接,提高區間訪問的性能
-
MyISAM存儲引擎索引實現
MyISAM索引文件和數據文件是分離的(非聚集)
-
.frm文件 存儲表結構和數據定義的信息
-
.MYD 存儲數據
-
.MYI 存儲索引
-
在使用了索引查找的情況下,先在MYI文件中定位到目標節點,再去MYD文件快速查找
InnoDB索引實現
表數據文件本身就是按B+Tree組織的一個索引結構文件
聚集索引 - 葉節點包含完整的數據記錄
- 爲什麼InnoDB必須有主鍵,並且推薦使用整型的自增主鍵?
- 需要一個主鍵索引,用B+Tree來組織維護數據。
- 沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作爲主鍵索引。
- 如果沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作爲隱含的聚集索引(ROWID隨着行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)
- 使用自增列(INT/BIGINT類型)做主鍵,這時候寫入順序是自增的,和B+Tree葉子節點分裂順序一致,無須頻繁的移動、分頁操作。
- 爲什麼非主鍵索引結構葉子節點存儲的是主鍵值?
- 保持一致性:當數據庫表進行DML操作時,同一行的頁地址會發生改變,因非主鍵索引保存的是主鍵的值,無需進行更改。
- 節省存儲空間:InnoDB數據本身就已經匯聚到主鍵索引所在的B+Tree上了,如果普通索引還繼續保存一份數據,就會導致有多少索引就要存多少份數據。