mysql查询优化-学习笔记

本篇文章是最近学习mysql优化相关知识的学习笔记,很多内容都仅仅是列出各个要点,方便自己梳理而已,读者有不理解的地方可以私我。

题外话:MySQL在2010年发布5.5版本中,优化器对in操作符可以自动完成优化,针对建立了索引的列可以使用索引,没有索引的列还是会走全表扫描。

索引是提高MYSQL查询性能的一个重要途径,但过多的索引会导致过高的磁盘使用和内存占用,从而影响应用程序的整体性能。因此创建高性能的索引就显得尤为重要。

高性能索引

在创建高性能索引之前,我们需要了解索引选择性的概念。

索引选择性是指不重复的索引值和数据表的总记录数的比值,选择性越高查询效率越高,因为选择性越高的索引可以让MySQL在查询时过滤掉更多的行。查看某列的选择性的方法是selectcount(distinctthe_rank)/count(*) from the_table唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

知道了要选择哪些列作为索引之后,便可以开始创建高性能索引了。

1、前缀索引

        如果我们要作为索引的列太长,可以使用该列的前缀来作为索引。

2、联合索引与索引顺序

        如果有sql语句形如selectid,name from the_table where id = '**' and name = '**'

一般来说,同时给id列和name列各添加一个索引并不是最好的选择,因为一次查询,mysql只会走一个索引,mysql会通过某个索引找到对应数据之后再做筛选。

        如果这个时候我们创建了一个(id,name)的联合索引,那么mysql可以直接通过索引找到对应的数据。

        注意:由于最左前缀原理,这里我们需要考虑到索引的顺序。

3、覆盖索引

    如果一个索引包含或者说覆盖所有需要查询的字段的值,那么就没有必要再回表查询,这就称为覆盖索引。

4、冗余和重复索引

        根据最左前缀原理可知, 如果有了索引(A,B),那么索引(A)就是不必要的了。

在创建了高性能索引之后,我们应该采用相应的策略,尽可能让查询走索引。换句话说,就是避免发生查询不走索引的情况。

高性能策略

1、避免多个范围条件

2、覆盖索引

3、使用索引扫描来排序

4、删除长期未使用的索引

不走索引的情况:

1、不符合最左前缀原理的时候

2、索引列为非独立的列(索引列是表达式的一部分,或函数的参数)

3、使用not in,!=,<>的时候

4、当使用like且以%开头的时候

参考文献:

1、http://blog.codinglabs.org/articles/theory-of-mysql-index.html

2、https://www.jianshu.com/p/d7665192aaaf

你可能感兴趣的:(mysql查询优化-学习笔记)