## 索引
數據庫索引類似于書的目錄。如果你想快速找到某一個主題,可以先查看目錄然后再翻到主題頁,而不用從頭到尾地去翻閱整本書來查找那個話題。
從一個表中查詢數據時,首先 MySQL 檢查是否存在索引,如何存在索引,MySQL 使用索引來選擇對應的行,而不是掃描整個表的物理行。
強烈建議您在經常查詢數據表的列(WHERE 子句條件中的那些列)上創建索引。 MySQL 會在表中所有主鍵列上自動創建索引。
索引有助于加快查詢數據,**為什么不在所有列上使用索引?**
如果在每一列上都創建索引,MySQL必須建立和維護索引表。每當一個修改表中數據時,MySQL 都要重建索引,數據量越大,花費的時間越多,會降低服務器的性能。
### MySQL 索引類型
**從數據結構角度**
- BTREE 索引
- RTREE 索引
- HASH 索引
- FULLTEXT 索引
| 存儲引擎 | 索引類型 |
| --- | --- |
| MyISAM | BTREE, RTREE,FULLTEXT |
| InnoDB | BTREE |
| MEMORY | HASH, BTREE |
**從物理存儲角度**
- 聚集索引:索引中鍵值的邏輯順序決定了行的物理順序
- 非聚集索引:索引中鍵值邏輯順序與物理存儲順序不同
**從邏輯角度**
- 單列索引:單個字段上創建的索引
- 多列索引:復合索引指多個字段上創建的索引
- 唯一索引: 索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一
- 主鍵索引:主鍵索引是一種特殊的唯一索引,不允許有空值
- 空間索引:空間索引是對空間數據類型的字段建立的索引
### 索引操作
創建索引語法:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
USING [BTREE|HASH|RTREE]
ON table_name(column_name[(length)][ASC|DESC],...)
給 *employee* 表的 *office_id* 列添加索引,如下所示:
CREATE INDEX idx_office_id ON employee (office_id);
刪除索引語法:
DROP INDEX index_name ON table_name
刪除 *employee* 表的 *idx_office_id* 索引,如下所示:
DROP INDEX idx_office_id ON employee
參考鏈接:[MySQL索引背后的數據結構及算法原理](http://blog.codinglabs.org/articles/theory-of-mysql-index.html)