# 索引
## 定義
**索引**是幫助MySQL高效獲取數據的**排好序**的**數據結構**
## 索引分類
索引類型|區別
---|---
普通索引|簡單索引,數據可以為空
主鍵索引|主鍵索引。索引列唯一且不能為空;一張表只能有一個主鍵索引
唯一索引|數據必須是唯一的,但可以為空
聯合索引|多個列聯合到一起建立的索引,使用時有最左原則需要注意
全文索引|全文搜索的索引。用于搜索很長一篇文章的時候,效果最好。用在比較短的文本,如果就一兩行字的,普通的 INDEX 也可以。
## 索引的數據類型
`B+tree`、`hash`
### 為什么沒有用`二叉樹`
#### 二叉樹的定義
[二叉樹]()
如果選擇二叉樹做索引的話假如說在主鍵建立索引,因為索引一般都是主鍵自增的,那就不會往樹的左節點做插入,那索引樹就會降級成為單向鏈表,如下圖所示:

原始二叉樹的查找`時間復雜度`是`O(1)`, 降級成為單向鏈表后的時間復雜度是`O(n)`
### 為什么沒有選擇`紅黑樹`
紅黑樹是一種含有紅黑結點并能自平衡的二叉查找樹。
雖然它能夠自平衡,但是樹的高度不可控,假如樹高20 那就需要查詢20次。也就是20次磁盤IO,如果數據量大的情況下,紅黑樹也是搞不定的。
### 為什么沒有用`BTree`
在計算機科學中,B樹(英語:B-tree)是一種自平衡的樹(多叉平衡樹),能夠保持數據有序。這種數據結構能夠讓查找數據、順序訪問、插入數據及刪除的動作,都在對數時間內完成。B樹,概括來說是一個一般化的二叉查找樹(binary search tree)一個節點可以擁有2個以上的子節點。與自平衡二叉查找樹不同,B樹適用于讀寫相對大的數據塊的存儲系統,例如磁盤。B樹減少定位記錄時所經歷的中間過程,從而加快存取速度。B樹這種數據結構可以用來描述外部存儲。這種數據結構常被應用在數據庫和文件系統的實現上。

節點元素從左到右依次遞增排列
子節點所有元素都在父節點區間內
沒有選擇B樹的原因是因為B樹的data是跟隨每個子節點的而B+tree的的數據和節點是分開存放的數據存放在非葉子節點上 這樣數據可以再有限的內存空間里面去維護更多的index
## B+tree
B+tree數據格式

## hash
查詢后經過hash運算可以快速獲取到某個具體數據的磁盤地址,理論上定向的條件查詢效率比較高,但是區間查詢就沒辦法用索引了,所以不推薦hash
每次查找都會把數據load到內存中,從而提高查詢效率
## index創建
ALTER TABLE `table_name` ADD INDEX `index_name` (`column_list`);
```shell script
ALTER TABLE user ADD INDEX index_name_city_age (NAME(16),CITY,AGE);
```
等價于
CREATE UNIQUE INDEX `index_name` ON `table_name` (`column_list`)
```shell script
CREATE INDEX user ON user (NAME(16),CITY,AGE)
```
### 其他創建語句
#### 主鍵索引
alter table `table_name` add primary key (`columns`);
#### 唯一索引
ALTER TABLE `table_name` ADD UNIQUE (`columns`);
#### 全文索引
ALTER TABLE `table_name` ADD FULLTEXT (`columns`);
## index刪除
### 普通索引刪除
DROP INDEX `index_name` ON `talbe_name`
等價于
ALTER TABLE `table_name` DROP INDEX `index_name`
### 主鍵索引刪除
ALTER TABLE `table_name` DROP `PRIMARY KEY`
## index查看
show index from `table_name`;
## mysql索引命中過程
@todo
- 簡介
- php
- php基礎
- php常用數組函數
- php常用字符串函數
- php魔術方法
- php高階
- swoole
- php優化
- workerman
- PHP底層運行機制和原理
- php框架
- laravel
- 前端
- react
- 爬蟲
- Scrapy
- Linux
- IO復用
- nginx
- nginx進程工作原理
- nginx配置
- 正向代理反向代理
- UPSTREAM
- SERVER
- HTTPS
- queue
- kafka
- redis
- DB
- mysql
- 存儲引擎
- 索引
- 鎖
- 觸發器
- 分庫分表
- 三范式
- 負載均衡
- 事務
- EXPLAN
- mysql死鎖
- mysql索引覆蓋與回表
- mysql聚簇索引與非聚簇索引
- NoSql
- memcache
- redis
- mongo
- 網絡協議
- tcp與udp
- https與http
- 架構
- LNMP架構下HTTP請求的調用次序
- 數據結構&算法
- 基礎數據結構
- Linked List
- array
- stack
- queue
- tree
- hash
- heap
- 常見算法
- 排序算法
- 查找算法
- 其他
- php的一些坑
- 常問面試題
- 技術面試最后反問面試官的話
- hr
- redis緩存擊穿、穿透、雪崩
- 面試中回答的不好的問題
- web攻擊防范