🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 索引 ## 什么是索引 >索引是存储引擎用于快速找到记录的一种数据结构 ### 索引有什么好处? * 减少查询需要扫描的数据量(加快了查询速度) * 减少服务器的排序操作和创建临时表的操作(加快了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