MySQL sql优化

(1)explain出来的各种item的意义

  • id:每个被独立执行的操作的标志,表示对象被操作的顺序。一般来说, id 值大,先被执行;如果 id 值相同,则顺序从上到下。

  • select_type:查询中每个 select 子句的类型。

  • table:名字,被操作的对象名称,通常的表名(或者别名),但是也有其他格式。

  • partitions:匹配的分区信息。

  • type:join 类型。

  • possible_keys:列出可能会用到的索引。

  • key:实际用到的索引。

  • key_len:用到的索引键的平均长度,单位为字节。

  • ref:表示本行被操作的对象的参照对象,可能是一个常量用 const 表示,也可能是其他表的

  • key:指向的对象,比如说驱动表的连接列。

  • rows:估计每次需要扫描的行数。

  • filtered:rows*filtered/100 表示该步骤最后得到的行数(估计值)。

  • extra:重要的补充信息。

(2)profile的意义以及使用场景

Profile 用来分析 sql 性能的消耗分布情况。当用 explain 无法解决慢 SQL 的时候,需要用profile 来对 sql 进行更细致的分析,找出 sql 所花的时间大部分消耗在哪个部分,确认 sql的性能瓶颈。

(3)explain 中的索引问题

Explain 结果中,一般来说,要看到尽量用 index(type 为 const、 ref 等, key 列有值),避免使用全表扫描(type 显式为 ALL)。比如说有 where 条件且选择性不错的列,需要建立索引。

被驱动表的连接列,也需要建立索引。被驱动表的连接列也可能会跟 where 条件列一起建立联合索引。当有排序或者 group by 的需求时,也可以考虑建立索引来达到直接排序和汇总的需求。