什么是索引
MySQL 官方對索引的定義:索引(Index)是幫助 MySQL高效獲取資料的資料結構,因此 索引的本質就是資料結構,索引的目的在于提高查詢效率,可類比字典、書籍的目錄等這種形式,
可簡單理解為 排好序的快速查找資料結構,在資料之外,資料庫系統還維護著 滿足特定演算法查詢的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構上實作高級查找演算法,這種資料結構就是索引,
一般來說,索引比較大,不可能全部存盤在記憶體中,因此索引往往以 索引檔案 的形式存盤在磁盤上,
平常所說的索引,如果沒有特別指明,都是 B 樹索引,其中聚集索引、次要索引、覆寫索引、前綴索引、唯一索引默認都是用 B 樹,
可以通過命令 show index from table_name 查看表的索引情況
索引的優缺點
優點
- 類似于大學圖書館的書目索引,提高資料的檢索效率,降低資料庫的 IO 成本
- 通過索引列對資料進行排序,降低資料的排序成本,從而降低 CPU 的消耗
缺點
- 索引實際上也是一張表,該表保存了主鍵與索引欄位,并指向物體表的記錄,所以索引列也要占用空間
- 雖然索引大大提高了查詢效率,但是降低了更新表的速度,如 insert、update 和 delete 操作,因為更新表時,MySQL 不僅要保存資料,還要保存索引檔案每次更新的索引列欄位,并且在更新操作后,會更新相應欄位索引的資訊
- 索引只是提高查詢效率的一個因素,如果你的 MySQL 有大量的資料表,就需要花時間研究建立最優秀的索引或優化查詢陳述句
索引分類
索引主要分為以下三類:
- 單值索引:一個索引只包含單個列,一個表可以有多個單值索引
- 唯一索引:索引列的值必須唯一,但允許有空值,主鍵就是唯一索引
- 復合索引:一個索引包含多個列
以索引的結構劃分為以下四類:
- BTREE 索引
- Hash 索引
- Full-Text 索引
- R-Text 索引
基本語法使用
創建索引
創建一個普通索引
CREATE INDEX index_name ON table_name (column_name(length))
也可以通過修改表結構的方式來添加索引
ALTER TABLE table_name ADD INDEX index_name (column_name(length))
注:如果是 char、varchar 型別的欄位,length 可以小于欄位實際長度;如果是blob、text 型別,必須指定 length
其它創建索引的方式
添加主鍵索引
ALTER TABLE table_name ADD PRIMARY KEY (column_name)
添加唯一索引
ALTER TABLE table_name ADD UNIQUE (column_name)
添加全文索引
ALTER TABLE table_name ADD FULLTEXT (column_name)
添加普通索引
ALTER TABLE table_name ADD INDEX index_name (column_name)
添加組合索引
ALTER TABLE table_name ADD INDEX index_name (column_name_1, column_name_2, column_name_3)
洗掉索引
DROP INDEX index_name ON table_name
查看索引
SHOW INDEX FROM table_name
需要建立索引的情況
- 主鍵自動建立唯一索引
- 頻繁作為 查詢條件 的欄位
- 查詢中與其它表關聯的欄位:外鍵關系建立索引
- 高并發 下趨向創建 組合索引
- 查詢中 排序 的欄位,排序欄位若通過索引去訪問將大大提高排序速度
- 查詢中 分組 欄位
不需要建立索引的情況
-
表記錄太少(資料量太少 MySQL 自己就可以搞定了)
-
經常增刪改的表
-
資料重復且平均分配的欄位,如國籍、性別等
-
頻繁更新的欄位不適合建立索引
-
Where 條件里面用不到的欄位同樣不適合建立索引
-
文章作者:彭超
-
本文首發于個人博客:https://antoniopeng.com/2019/05/15/mysql/%E4%B8%80%E6%96%87%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8MySQL%E7%B4%A2%E5%BC%95/
-
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自 彭超 | Blog!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/56200.html
標籤:MySQL
上一篇:MySQL 表示日期的資料型別
下一篇:MySQL 性能優化小結
