索引

简介

在mysql中索引是为了加速查询而出现的,但是存储索引会增加磁盘消耗以及降低数据插入的速度,所以索引并不是越多越好,需要找到一个适合业务的平衡点。以下讨论有一个前置条件,存储引擎为innodb

mysql索引分为B+树索引hash索引全文索引

B+树

mysql使用B+树是为了在存放相同数据时尽力降低树的层高,减少查询io次数,加速查询速度。

B+树索引分为聚簇索引与辅助索引(第二索引)

聚簇索引

聚簇索引即由主键值构建成的B+树,非叶子节点只存放主键值,叶子节点存放了主键值以及行数据,通过主键值就可以直接获取到对应的数据

当创建表没有设置主键时mysql会查找第一个唯一索引作为主键值,如果唯一索引也不存在mysql会隐式的创建一个主键

由于聚簇索引叶子节点包含了数据,所以主键值应当相对有序,不然会造成频繁的页分裂与页合并从而降低插入、删除效率

辅助索引

即由非主键构成的B+树,辅助索引叶子节点存放的不是数据而是对应数据的主键值,所以通过辅助索引查找数据需要先找到主键值,再使用主键值去聚簇索引查找真正的数据(这一过程称为回表)
但是也不是每一次查询都需要回表;当辅助索引中包含了需要查询的数据列时就可以直接返回而不需要回表

hash索引

hash索引:对值进行hash后再查找数据,时间复杂度为o(1),速度非常快,但是hash索引存在一些缺陷:只能进行等值查询,无法进行范围查询、排序

msyql中一般只采用自适应hash索引,即单频繁访问某条数据时,innodb就会为该数据创建hash索引,之后访问时就可以直接获取从而提高效率,但这一行为是由innodb自动控制,用户无法干预

全文索引

全文索引是为了对长文本(书籍、文章等)进行搜索而设计的,使用倒排索引实现,即对文本进行分词,每个词包含了它存在的文本的id。

索引优化

posted @ 2021-02-23 11:16  犬犬呀  阅读(13)  评论(0)    收藏  举报