sql优化------持续更新学习中

sql优化

做MySQL优化,我们要善用explain查看SQL执行计划

sql优化------持续更新学习中

explain的功能:

通过关键字 explain 可以分析出:

  1. 表的读取顺序
  2. 表的读取操作的读取类型
  3. 哪些索引有可能会被使用到
  4. 哪些索引被实际使用了
  5. 表之间的引用
  6. 每张表有多少行被优化器查询

每个字段的含义:

  1. id - id值越大,就越先被MySQL执行,如果id相同的话 可以认为是同一组,按照从上到下顺序执行。

  2. select_type - 查询类型,是简单查询、子查询、主键查询等,具体类型如下:

SIMPLE(简单的SELECT语句)

PRIMARY(查询中最外层的SELECT)/UNION(查询中处于内层的SELECT)

DEPENDENT UNION(UNION操作中,查询中处于内层的SELECT)/UNIOIN RESULT(UNION操作的结果,id值通常为NUL)

SUBQUERY(子查询中首个SELECT)/DEPENDENT SUBQUERY(严重消耗性能)(子查询中首个SELECT,但依赖于外层的表)

DERIVED(被驱动的SELECT子查询)/MATERIALIZED(被物化的子查询)

UNCACHEABLE SUBQUERY(对于外层的主表,子查询不可被物化,每次都需要计算)/UNCACHEABLE UNION(UNION操作中,内层的不可被物化的子查询)

  1. table - 该行所引用的表名

  2. type - 显示了查询使用到了那种类型,从最优的查询到最差的排序为:索引type从优到差:System–>const–>eq_ref–>ref–>ref_or_null–>index_merge–>unique_subquery–>index_subquery–>range–>index–>all(全表扫描)

  3. possible_key - 能会用到那些索引在该表中找到行级记录

  4. key - 实际从 possible_key 选择使用的索引。如果为 NULL,则没有使用索引。很少的情况 下,MYSQL 会选择优化不足的索引。这种情 况下,可以在 SELECT语句中使用 USE INDEX (indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制 MYSQL 忽略索引.

  5. key_len - 使用的索引的长度。在不损失精确性的情况下,长度越短越好。

  6. ref - 显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或者常量被用于查找索引列上的值。

  7. rows - 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。

  8. filtered - 显示了通过条件过滤出的行数的百分比估计值。

  9. Extra - 就是除了以上MySQL要展示的重要的信息之外的一个附加信息,一般四种情况

Using filesort

Using temporary

Using index

Not exists

重要!
key、type 、rows、extra,其中 key 为 null 时,说明没有使用到索引,需要调整索引,type为all的地方,都是需要进行优化的地方.一般需要达到 ref级别,范围查找需要达到 range,extra有Using filesort、Using temporary 的一定需要优化,根据rows可以直观看出优化结果。