《MySQL学习》 索引 上
MySQL索引的出现就是为了加快数据的查询效率,与字典的前几页目录一样,快速定位你需要的数据所在'页';
索引类型分类
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
普通索引
普通索引在数据上无任何限制,值可以为空,一张表可以有多个普通索引
CREATE INDEX index_name ON table(column(length))
唯一索引
唯一索引在普通索引的基础上加了条件必须值不能重复,但可以为空,一张表可以有多个唯一索引
CREATE UNIQUE INDEX indexName ON table(column(length))
主键索引
主键索引一定是唯一索引,但唯一索引不一定是主键,但相比唯一索引,主键索引要求值不能为空,且整张表只能有一个主键索引
ALTER TABLE `table` ADD PRIMARY KEY ( `column` )
组合索引
组合索引由多个索引组合构成,可以是主键索引+唯一索引,也可以是普通索引+普通索引等等
但使用主键索引需要遵循最左前缀原则
ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);
索引的数据结构
索引的实现方式有很多,常见有三种
- Hash表
- 有序数组
- 搜索树
Hash表
Hash表是一种key-value 的数据结构,key由Hash计算所得。由于key可能重复,所有还需要挂上一个链表,在链表上遍历与key是否相等,取出等值的value。
等值查询可以快速定位位置,但如果需要范围查询,那么久需要扫描所有的数据,效率太差。而如果使用有序数组在等值查找和范围查询场景中的性能就都非常优秀
有序数组
有序数组适合存储静态数据,等值查询和范围查询效率都非常高,数组查询修改数据很快,但插入删除数据需要移动位置,效率很差
搜索树
B+树即适合做等值查询,也适合做范围查询
InnoDB的索引模型
InnoDB每个索引都是一棵B+树,每张表都会有有且仅有一个聚簇索引,聚簇索引非叶子节点存放索引值(索引越小,节点存放的索引数据越多),而叶子结点存放页数据(链表的形式存储行记录)
除了聚簇索引,表的其他索引都为非聚簇索引
非聚簇索引 叶子节点存放的是聚簇索引的索引键值,因此,在非聚簇索引上找到的数据需要到聚簇索引上根据索引键值找行记录数据,这一行为称为回表。我们可以使用索引下推来避免回表
索引的维护
B+树为了维护索引的有序性,在插入和删除值的时候,都需要做必要的维护。而如果插入和删除的数据是乱序的,需要移动分割页的数据,产生页分裂和页合并现象。使用自增主键可以避免页分裂现象,逻辑删除可已在一定程度上避免页合并现象
如果一张表需要重建索引(删除主键索引与普通索引),那么应该先删除普通索引,在删除主键索引,最后先创建主键索引,再创建普通索引。 普通索引是基于主键索引的(没有主键就是rowid)。
#23届找工作求助阵地##mysql##java#