什麼是索引 MySQL 官方對索引的定義:索引(Index)是幫助 MySQL高效獲取數據的數據結構。因此 索引的本質就是數據結構 。索引的目的在於提高查詢效率,可類比字典、書籍的目錄等這種形式。 可簡單理解為 排好序的快速查找數據結構 。在數據之外,資料庫系統還維護著 滿足特定演算法查詢的數據結構 ...
什麼是索引
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 條件裡面用不到的欄位同樣不適合建立索引
-
文章作者:彭超
-
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 彭超 | Blog!