一文快速入門 MySQL 索引

什麼是索引

MySQL 官方對索引的定義:索引(Index)是幫助 MySQL高效獲取數據的數據結構。所以 索引的本質就是數據結構。索引的目的在於提升查詢效率,可類比字典、書籍的目錄等這種形式。mysql

可簡單理解爲 排好序的快速查找數據結構。在數據以外,數據庫系統還維護着 知足特定算法查詢的數據結構,這些數據結構以某種方式指向數據。這樣就能夠在這些數據結構上實現高級查找算法,這種數據結構就是索引。算法

通常來講,索引比較大,不可能所有存儲在內存中,所以索引每每以 索引文件 的形式存儲在磁盤上。sql

日常所說的索引,若是沒有特別指明,都是 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))複製代碼

也能夠經過修改表結構的方式來添加索引spa

ALTER TABLE table_name ADD INDEX index_name (column_name(length))複製代碼

注:若是是 char、varchar 類型的字段,length 能夠小於字段實際長度;若是是blob、text 類型,必須指定 lengthcode

其它建立索引的方式

添加主鍵索引

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 條件裏面用不到的字段一樣不適合創建索引
  • 文章做者:彭超
  • 本文首發於我的博客:antoniopeng.com/2019/05/15/…
  • 版權聲明:本博客全部文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 彭超 | Blog
相關文章
相關標籤/搜索