记一次 SQL 优化过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16399991/article/details/81780726

1.问题

定位到问题SQL ,耗时5s多

2.解决过程

  1.通过EXPLAIN 分析低效sql的执行计划

----------------------------------------------------------------

返回字段说明:
select_type:表示select 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即完成的查询)、UNION(UNION中第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。

table:输出结果集表。

type: 表示mysql在表中找到所需行的方式,或者叫访问类型,常见的类型有

ALL index range ref eq_ref const,system NULL

从左至右 性能有最差到最好。

  (1)type=ALL,全表扫描,mysql遍历全表来找到匹配的行。

  (2)type=index,索引全扫描,mysql遍历整个索引,来查询匹配的行

  (3)type=range,索引范围扫描,常见于> 、>=、<、<=、BETWEEN 等操作。

  (4)type=ref、使用非唯一索引扫描,或者唯一索引的前缀扫描,返回匹配有个单独值的记录行。

  (5)type=eq_ref,类似ref,区别就在于使用的索引是唯一索引,对于每个索引键,表中只有一条记录匹配;简单说,就是多表连接中使用primary key 或者 unique index 作为关联条件。

  (6)type=const/system, 单表中最多有一个匹配行,查询起来非常迅速,所以这个匹配行中的其他列的值可以被优化器在当前查询中当做常量来处理。例如,根据primary key 或者唯一索引 unique index 进行查询。

  (7)type=NULL,mysql 不用访问表或者索引,直接就能得到结果。

   (8)类型type还有其他值,如ref_or_null(与ref类型,区别在于条件包含对NULL的查询),index_merge(索引合并优化),unique_subquery(in的后边是一个查询主键字段的子查询)、index_subquery(与unique_subqueryl类似,区别在于 in的后边是一个查询非唯一索引字段的子查询)。

possible_key: 表示查询时可能使用的索引。

key:表示实际使用的索引

rows:扫描行的数量

Extra:执行情况的说明和描述。表示不适合在其他类中显示,但是对执行计划非常重要的额外信息。

------------------------------------------------------------

本例分析:

t_a_p的type使用的全表扫描, 在borrow_id建立索引。

再次查看执行计划,原来全表扫描 变成了 REF。扫描行数变成了1行。

猜你喜欢

转载自blog.csdn.net/qq_16399991/article/details/81780726