mysql使用explain优化,以及索引的建立

通过使用explain来优化sql,对于基础的项目来说,访问速度慢的主要原因几乎上都是sql语句,或者有垃圾代码,导致了很多不必要的计算或者查询。我们可以通过explain选择更好的索引写出速度更快的查询语句。

使用explain分析sql,会输出分析结果,例如:

1
explain SELECT `products`.* FROM `products` WHERE `products`.`state` = 1 AND `products`.`catalog_id` = 335 AND `products`.`sell` = 1 ORDER BY priority desc limit 20


介绍一下各列的意义,其中:

  1. id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表示这是一个结果集,不需要使用它来进行查询。
  2. select_type,select类型,它有以下几种值
    2.1:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个
    2.2:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个
    2.3:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
    2.4:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响
    2.5:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
    F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
    2.6:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
    2.7:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select