[置顶] Mysql性能优化(二) 索引优化

    承接上一篇博客,今天我们分析一下mysql优化中关于索引优化的解决方案。

    首先我们先介绍几个关于索引的常见的概念:

    1、多列索引

    索引分为了B-tree索引、hash索引等,不同的索引形式又有独特的地方。Mysql的引擎不同,默认的索引形式不同,例如MyIsam和InnoDB默认支持的索引是B-tree。在memory表中默认的是hash索引,hash索引因为其时间复杂度为O(1),虽然查询效率很高,但它也有自己的缺点,比如hash函数的计算结果为随机的,放到磁盘上的位置不确定等。而多列索引意思就是在不同的字段上加上索引,很自然,在使用的时候就需要满足要求了。不是只要用到了加索引的字段,就是使用的该索引,   

    2、聚簇索引

    Mysql引擎不同,聚簇索引指定的含义也不同。如果两种引擎文件都用树状结构来表示的话,MyIsam引擎,它的次索引和主索引指向的是数据所在的物理地址,对于innodb引擎来说,它的次索引指向的是主键的引用,也就是在innodb中,主键的索引结构中既存储了主键值,又存储了行数据,这种结构就称为聚簇索引。也是由于两种引擎所存储的不同,当节点在进行分裂的时候,很显然聚簇索引此时就不占优势了,分裂过程不仅要移动物理地址,还要移动行数据。

    3、索引覆盖、冗余索引、重复索引

    索引覆盖:我们设置了多列索引,如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需 要回行到磁盘再找数据,这样查询速度非常快。

    冗余索引:指两个索引覆盖的列有重叠

    重复索引:指同一个列建立了多个索引

    重复索引只会增大索引文件的,减小查询时间,效率上不好。


    以上就是索引的基本知识,一个理想的索引的建立首先我们需要查询的数据所在字段频繁,而且索引的区分度高,长度小,并且尽可能的覆盖我们经常查询的所有字段。

    通过学习索引的基本知识,下面我们分析索引优化的相关内容。

加索引与不加索引的对比:

  下面分析两条sql语句,其中id是加索引的,name是不加索引的。

[置顶] Mysql性能优化(二) 索引优化_第1张图片

下面我们给name字段加上索引,在分析影响行数:

[置顶] Mysql性能优化(二) 索引优化_第2张图片

[置顶] Mysql性能优化(二) 索引优化_第3张图片

    由此可见,加索引和不加索引对于查询数据所影响的数据行数是不同的,显然不加索引要影响的行数会多。

like关键字查询:

    在使用like关键字查询的时候,对于模糊查询%所在的位置也影响了查询是否使用了索引,下面我们通过两条sql语句分析%位置对查询使用索引的影响:

[置顶] Mysql性能优化(二) 索引优化_第4张图片

[置顶] Mysql性能优化(二) 索引优化_第5张图片

    由此可见,使用like进行模糊查询时,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用。

如果sql语句中有了or或者and的话

   下面通过两个sql语句进行分析使用索引的情况:

[置顶] Mysql性能优化(二) 索引优化_第6张图片

[置顶] Mysql性能优化(二) 索引优化_第7张图片

    由此知道只有当or或者and关键字前后都使用了索引,那么整个语句使用的索引才会生效。

如果sql语句中使用的字段类型不一样是否会影响索引的使用


    Name为字符串类型,给一个字符串类型赋予了一个整形的值,此时是不使用索引的。

    以上就是简单的总结关于索引优化相关的知识,除了在索引方面进行优化我们的mysql,我们同样可以在数据库方面表的其他方面,比如建立视图,定期优化表,清除表空间的碎片等,或者在sql语句的写法方面进行优化。下篇博客我们介绍从数据库操作的角度分析如何进行mysql的优化。


你可能感兴趣的:([置顶] Mysql性能优化(二) 索引优化)