什么是索引
使用过数据库或者ES的工作人员应该对索引不会陌生,因为索引在存储方面是一个很重要的概念,索引可以简单的类比成我们新华字典前面的查找表,索引可以在查询多于写入的情况下大幅提升效率,如果没有索引,当sql查询某条件数据时需要从第一条数据开始遍历整张表数据查看所以符合条件的记录,但是如果存在索引就可以直接读取索引文件避免遍历整张表。
Mysql索引原理
索引是在存储引擎中实现的,Mysql有很多种存储引擎,这里我们只关注最常用的两种,InnoDB和MyISAM引擎(sql语句show variables like '%storage_engine%'可以查看当前数据库采用的什么引擎)。这两种引擎都只支持BTREE索引,但是这两种引擎又存在区别,InnoDB主键索引叫聚簇索引,MyISAM的索引为非聚簇索引,现在网上对聚簇索引和非聚簇索引有两中说法,一种就是按照引擎区分,一种是按照索引是否数据在一起来区分,这两个的区别在于InnoDB非主键索引是否是聚簇索引,我可能更倾向于不是聚簇索引的说法,下面我们来看下:
-
InnoDB聚簇索引
innoDB的主索引是聚簇索引,就是表数据就直接存在于索引中的叶子节点,当查询完主索引就能获取到查询所需数据。表必会存在一个聚簇索引,当表存在主键时会按照主键生成,如果表中没有主键或者一个合适的的唯一索引,InnoDB内部会以一个包含行ID值的合成列生成一个隐藏的聚簇索引,其他索引称为辅助索引(非聚簇索引),辅助索引的叶子节点关联着聚簇索引的索引id。
优点:主键索引查找可以直接返回数据。
缺点:辅助键查找需要回表(再查下主键索引)进行查询。如果主键需要更改在叶子节点层面就可能需要修改物理数据的存放位置。 -
MyISAM非聚簇索引
MyISAM索引称为非聚簇索引,虽然都是BTREE形式,区别就在于MyISAM的表数据和索引数据是分开的,主索引和辅助索引的叶子节点存储的是行数据的物理地址,然后通过物理地址获取相应的行数据
优点:辅助键查询和主键查询一样,都只需要一次寻址查找就能获取数据。
缺点:主键查找需要额外一次寻址。 -
经典图
我们可以看出聚簇索引和非聚簇索引最大的区别就在于索引叶子节点是否直接存放数据。
总结
在Mysql5.5版本之后默认存储引擎就是InnoDB,所以索引采用的就是BTREE索引。索引还有很多注意事项,譬如当字段值种类很少的时候不适合作为索引字段,构建索引会额外的增加构建的成本,所以需要根据情况构建索引。









网友评论