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.索引簡介