# 索引
## 什么是索引
>索引是存儲引擎用于快速找到記錄的一種數據結構
### 索引有什么好處?
* 減少查詢需要掃描的數據量(加快了查詢速度)
* 減少服務器的排序操作和創建臨時表的操作(加快了groupby和orderby等操作)
* 將服務器的隨機IO變為順序IO(加快查詢速度).
### 索引有什么壞處?
* 索引占用磁盤或者內存空間
* 減慢了插入更新操作的速度
### 索引種類
>邏輯角度
1. **「主鍵索引」**(`PRIMARY KEY`):主鍵索引一般都是在創建表的時候指定,**「一個表只有一個主鍵索引」**,特點是**「唯一、非空」**。
2. **「唯一索引」**(`UNIQUE`):唯一索引具有的特點就是唯一性,可以在創建表的時候指定,也可以在創建表后創建。
3. **「普通索引」**(`INDEX`):普通索引唯一的作用就是加快查詢。
4. **「組合索引」**(`INDEX`):組合索引是創建一個**「多個字段的索引」**,這個概念是相對于上上面的單列索引而言,組合索引查詢遵循**「最左前綴原則」**。
5. **「全文索引」**(`FULLTEXT`):全文索引是針對一些大的**「文本字段」**創建的索引,也稱為**「全文檢索」**。
>物理存儲
1. 聚簇索引
關系表記錄的物理順序與索引的邏輯順序相同,一張表最多也只能存在一個聚簇索引,而且主鍵值和所有列數據放在一起
2. 非聚簇索引
索引文件和數據文件是分開的,索引文件只存儲了值的地址
>前綴索引
在對一個比較長的字符串進行索引時,可以僅索引開始的一部分字符,這樣可以大大的節約索引空間,從而提高索引效率.但是這樣也會降低索引的選擇性.

>聯合索引
組合索引即用多個字段創建一個索引,組合索引能夠避免**「回表查詢」**,相對于多字段的單列索引,組合索引的查詢效率更高。
#### 什么是回表查詢?
**通過二級索引查詢數據,得不到完整的數據行,需要再次查詢主鍵索引來獲得數據行**
#### 索引覆蓋
**索引的葉子節點已經包含了查詢的數據,沒必要再回表進行查詢。**
#### 索引下推
**就是在執行sql查詢的時候,會將一部分的索引列的判斷條件傳遞給存儲引擎,由存儲引擎通過判斷是否符合條件,只有符合條件的數據才會返回給Mysql服務器**
### 索引碎片
在索引的創建刪除過程中,不可避免的會產品索引碎片,當然還有數據碎片,我們可以通過執行`optimize table xxx`來重新整理索引及數據,對于不支持此命令的存儲引擎來說,可以通過一條無意義的alter語句來觸發整理,比如:將表的存儲引擎更換為當前的引擎,
`alter table xxxx engine=innodb`
#### 碎片的分類?
內部碎片:對于當前頁的數據來說,我們**更新**了某條數據的某個列,造成當前頁不能容納數據,造成了頁的分裂
外部碎片:對于當前頁的數據來說,**新增**一條數據,造成了頁的分裂
>數據結構
1. B+樹
2. hash
3. fulltext
4. R-tree
- 消息隊列
- 為什么要用消息隊列
- 各種消息隊列產品的對比
- 消息隊列的優缺點
- 如何保證消息隊列的高可用
- 如何保證消息不丟失
- 如何保證消息不會重復消費?如何保證消息的冪等性?
- 如何保證消息消費的順序性?
- 基于MQ的分布式事務實現
- Beanstalk
- PHP
- 函數
- 基礎
- 基礎函數題
- OOP思想及原則
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收機制
- php-fpm相關
- 高級
- 設計模式
- 排序算法
- 正則
- OOP代碼基礎
- PHP運行原理
- zavl
- 網絡協議new
- 一面
- TCP和UDP
- 常見狀態碼和代表的意義以及解決方式
- 網絡分層和各層有啥協議
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 鎖
- 索引
- 事務
- 高可用?高并發?集群?
- 其他
- 主從復制
- 主從復制數據延遲
- SQL的語?分類
- mysqlQuestions
- Redis
- redis-question
- redis為什么那么快
- redis的優缺點
- redis的數據類型和使用場景
- redis的數據持久化
- 過期策略和淘汰機制
- 緩存穿透、緩存擊穿、緩存雪崩
- redis的事務
- redis的主從復制
- redis集群架構的理解
- redis的事件模型
- redis的數據類型、編碼、數據結構
- Redis連接時的connect與pconnect的區別是什么?
- redis的分布式鎖
- 緩存一致性問題
- redis變慢的原因
- 集群情況下,節點較少時數據分布不均勻怎么辦?
- redis 和 memcached 的區別?
- 基本算法
- MysqlNew
- 索引new
- 事務new
- 鎖new
- 日志new
- 主從復制new
- 樹結構
- mysql其他問題
- 刪除
- 主從配置
- 五種IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何實現手機掃碼登錄功能
- laravel框架的生命周期