MySql中的覆盖索引

    大家好,由于最近在工作中使用MySql时遇到了一个查询问题,涉及到索引覆盖的问题,所以在这里和大家分享博主关于索引覆盖的学习知识。

    首先博主在工作中发现有同事在进行数据查询时,使用的是select * 的查询方式,由于一直知道不建议使用这种方式,但是不知道具体原因,所以查找了一些资料,简要来说不建议使用select * 查询语句的主要原因有以下几点:

    1.过多的多余字段会带来数据传输的速度问题,即使MySql客户端和服务端是处在同一台机器上,但是MySql还是使用的TCP协议进行数据传输,过多的字段必定带来的是数据传输速度的下降。

    2.如果字段中出现类似于text,blob这种长度较大的字段时,MySql会将大长度的字段存储在其他空间中,不会和其他字段进行相同空间的存储,所以select * 会增加I/O次数。

    3.索引覆盖问题,下面将详细介绍。

    首先InnoDB在组织数据时,采用的方式是索引组织表,表中的数据时按照主键顺序进行存放的,然后再按照主键生成一棵B+Tree,然后在叶子节点中存储整张表的数据以及索引值,然后在解释索引覆盖之前,我们先解释一下MySql中的常见的两个索引概念:辅助索引和聚集索引。

    聚集索引:聚集索引也就是我们说的主键索引,在聚集索引的叶子节点中存储的是数据页,也就是上面我们说的表数据的集合。而且要另外强调的是,在MySql中不同的索引类型对于索引类型的支持是不同的,具体内容大家可以参考《深入浅出MySql》一书。

    辅助索引:在辅助索引中,存储的是键值以及指向主键索引的书签。

    我们在查询中,如果使用了辅助索引,MySql会首先查找到键值,然后根据书签找到主键索引,再从表中拿到数据,然后进行返回,所以辅助索引也被称为是二级索引。

    覆盖索引的意思是说如果一个查询语句只需要从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。也就是说查询可以直接从索引中取得相应的值,不需要再通过主键索引去查询,这样的好处是显而易见的,由于减少了一次索引过渡,所以可以极大的增快查询速度。

    那么怎么确定覆盖索引会被使用到呢?很简单,只需要在查询进行前,进行explain一下就可以了,可以通过select type 来确定。

    返回我们最初的问题,由于我们在使用select * 进行查询时,表中的所有字段不可能全部都有索引,所以就会造成查询需要根据书签到数据页中进行查询,所以就会降低查询速度。

    好了,这次的分享就这些,博主能力有限,如果有什么错误,还请大家多多指教。

    

你可能感兴趣的:(数据库)