MySQL高级(3) 索引入门
索引介绍
为什么要使用索引?
查询快
索引的概念和分类
概念
是帮助MySQL搞笑获取数据的数据结构,可以简单的理解为"排好序的快速查找数据结构".
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,
这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引
简单的理解,就是使用B+树构建的一个"目录"
为什么使用B+树而不是B树?
理论上B树的查找速度要比B+树快, 但是在有限的内存中, B+树可以存储更多的数据, 这样可以提高索引的命中率, 所以MySQL选择了B+树
举例
如图是一个B+树,非叶子节点存储的都是数据范围,只有叶子节点存储的是确切的值和对应的指针(指向物理地址),数据库执行查询时,不断的从根节点向下查找该值所在的范围,知道查找到叶子节点,然后读取相应的物理地址
一般来说索引占用内存也很大,不可能全都存储在内存中,所以索引一般以索引文件的形式存储在磁盘上
分类
聚簇索引
按照顺序排列, 如id自增的主键
非聚簇索引
不按照顺序排列, 一般在数据库中, 除了主键是聚簇索引, 其他都是非聚簇索引
单值索引
只有一个字段作为索引
唯一索引
该索引的值是唯一的(unique)
主键索引
默认主键自动创建索引
复合索引
多个字段作为索引
索引的优缺点
优点
- 提高了数据检索的效率,降低数据的IO成本
- 降低数据排序的成本,降低CPU的消耗
缺点
- 实际上索引也是一张表,保存了主键与索引字段,并指向实体表的记录,要占用空间
- 虽然大大提高了查询速度,但是会降低更新速度,如对表进行
insert
,update
和delete
操作时,MySQL不仅要保存数据,还要保存索引
索引入门
创建的创建和删除
创建索引
- 一般语法(最常用)
create [unique] index <索引名> on <表名>(<索引字段列表>);
# 或者
alter table <表名> add index <索引名> (<索引字段列表>);
举例
create index idx_age_dep_name on emp(age,dep,name);
# 或者
alter table emp add index idx_age_dep_name (age,dep,name);
- 创建一个主键索引(本质上是添加或更换一个表的主键)
alter table <表名> add primary key(&l