# 索引
## 什么是索引
>索引是存储引擎用于快速找到记录的一种数据结构
### 索引有什么好处?
* 减少查询需要扫描的数据量(加快了查询速度)
* 减少服务器的排序操作和创建临时表的操作(加快了groupby和orderby等操作)
* 将服务器的随机IO变为顺序IO(加快查询速度).
### 索引有什么坏处?
* 索引占用磁盘或者内存空间
* 减慢了插入更新操作的速度
### 索引种类
>逻辑角度
1. **「主键索引」**(`PRIMARY KEY`):主键索引一般都是在创建表的时候指定,**「一个表只有一个主键索引」**,特点是**「唯一、非空」**。
2. **「唯一索引」**(`UNIQUE`):唯一索引具有的特点就是唯一性,可以在创建表的时候指定,也可以在创建表后创建。
3. **「普通索引」**(`INDEX`):普通索引唯一的作用就是加快查询。
4. **「组合索引」**(`INDEX`):组合索引是创建一个**「多个字段的索引」**,这个概念是相对于上上面的单列索引而言,组合索引查询遵循**「最左前缀原则」**。
5. **「全文索引」**(`FULLTEXT`):全文索引是针对一些大的**「文本字段」**创建的索引,也称为**「全文检索」**。
>物理存储
1. 聚簇索引
关系表记录的物理顺序与索引的逻辑顺序相同,一张表最多也只能存在一个聚簇索引,而且主键值和所有列数据放在一起
2. 非聚簇索引
索引文件和数据文件是分开的,索引文件只存储了值的地址
>前缀索引
在对一个比较长的字符串进行索引时,可以仅索引开始的一部分字符,这样可以大大的节约索引空间,从而提高索引效率.但是这样也会降低索引的选择性.
![](https://img.kancloud.cn/14/af/14afb1da5ce7cd9d6278ecdfcf0ca495_1481x681.png)
>联合索引
组合索引即用多个字段创建一个索引,组合索引能够避免**「回表查询」**,相对于多字段的单列索引,组合索引的查询效率更高。
#### 什么是回表查询?
**通过二级索引查询数据,得不到完整的数据行,需要再次查询主键索引来获得数据行**
#### 索引覆盖
**索引的叶子节点已经包含了查询的数据,没必要再回表进行查询。**
#### 索引下推
**就是在执行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框架的生命周期