1.索引的分类
1.按照功能来分,可以分为主键索引、唯一索引、普通索引、全文索引
2.按照索引字段个数来分,可以分为单列索引、联合索引
3.按照物理实现方式来分,可以聚簇索引、非聚簇索引
2.适合添加索引的场景
1.具有唯一性约束的字段。
2.频繁地作为where查询条件的字段,包括select/update/delete。
3.需要gruop by 或 order by的字段
4.distinct字段需要添加索引(实测在数据量小的情况下意义不大)
5.多表连接join时需要注意的事项:连接表的张数最好不要超过3张,对where条件的字段增加索引,对于两表之间的关联字段,被关联表的该字段需要有索引且字段在两表中的属性保持一致。
6.区分度高的字段适合作为索引,反之则不适合。举例:性别字段就两种类型,这种区分度就很低,不适合作为索引。我们常用的xxId,一般来说这种id都是唯一的,每个人的id都不一样,这种区分度就是100%,非常适合作为索引。
3.慢sql分析
可以开启慢sql日志,然后分析慢sql日志中的慢sql。
在my.cnf中开启慢sql日志:
long_query_time=1; //设置慢查询的标准是1S,超过1S就是慢查询。
slow_query_log=ON; //设置开启慢查询日志记录
4.profile分析
对于慢查询sql,可以使用profile工具进行分析,确定SQL主要耗时是在什么步骤。
show profiles; //查询最近的一些sql
show profile for query 704; //展示我们需要查询的sql的详细耗时情况
可以看到上述sql耗时主要在executing步骤,也就是执行阶段。这种时候就需要explain一下sql,查看具体的执行计划进行分析。
5.explain分析
可以看到上述sql走了name索引,Using index表示是走了覆盖索引,但是还是耗时很长,最主要的原因就是扫描的行太多了,也就是rows字段,多达9307475行,就是数据量太大导致的耗时长。
5.1 explain重要关键字分析
explain的关键字还挺多的,每个关键字的各种情况分析也有点复杂,我们只需要记住最重要的几个关键字即可。下图是一个explain的所有关键字。
5.1.1 type
执行计划的一条记录代表的是MySQL对于某个表的执行查询时的访问方法,又称访问类型,其中type列就表明这个访问方法是啥。比如上面看到的type值是ref,表明mysql是使用ref访问方法来执行上述sql。
访问方法的所有值如下:system、const、eq_ref、ref、fulltext、ref_or_null、index_merge、unique_subquery、index_subquery、range、index、ALL
从前往后,查询速度越来越慢,ALL就代表全表扫描,是最慢的情况。
5.1.1.1 system
当使用精确统计的表,且表内只有一条记录时,进行的查询会是system。
5.1.1.2 const
当使用主键索引或者唯一索引对某个常量进行等值匹配时,进行的查询会是const,这种情况只会匹配一行记录。