索引用來快速地尋找那些具備特定值的記錄,全部MySQL索引都以B-樹的形式保存。若是沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的全部記錄,直至找到符合要求的記錄。表裏面的記錄數量越多,這個操做的代價就越高。若是做爲搜索條件的列上已經建立了索引,MySQL無需掃描任何記錄便可迅速獲得目標記錄所在的位置。若是表有1000個記錄,經過索引查找記錄至少要比順序掃描記錄快100倍。 算法
主鍵索引數據庫
查詢索引數據結構
全文索引spa
惟一索引指針
普通索引排序
數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現一般使用 B 樹及其變種 B+ 樹。索引
在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就能夠在這些數據結構上實現高級查找算法。這種數據結構,就是索引。ci
爲表設置索引要付出代價的:一是增長了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(由於索引也要隨之變更)。innodb
上圖展現了一種可能的索引方式。左邊是數據表,一共有兩列七條記錄,最左邊的是數據記錄的物理地址(注意邏輯上相鄰的記錄在磁盤上也並非必定物理相鄰的)。爲了加快 Col2 的查找,能夠維護一個右邊所示的二叉查找樹,每一個節點分別包含索引鍵值和一個指向對應數據記錄物理地址的指針,這樣就能夠運用二叉查找在 O(log2n)的複雜度內獲取到相應數據。table
佔用磁盤空間
對DML(update、delete、insert)語句的效率影響
增刪改會對索引影響,由於索引要從新整理。
存儲引擎 |
容許的索引類型 |
myisam |
btree |
innodb |
btree |
memory/yeap |
Hash,btree |
查詢做爲查詢條件字段應該建立索引
惟一性太差的字段不適合單首創建索引,即便頻繁
Select * from emp where sex=’男’
頻繁更新字段,也不要定義索引。
不會出如今where語句的字段不要建立索引
總結:滿處一下條件的字段,才應該建立索引
① 確定在where條件常常使用
② 該字段的內容不是惟一的幾個值
③ 字段內容不是頻繁變化