[数据库] ------ mysql 执行计划

mysql 执行计划

简单来说,mysql整体架构分为三块:应用层,逻辑层,物理层
应用层:负责与客户端交互,建立连接,返回数据,响应请求。
逻辑层:负责查询处理,事务管理等
物理层:实际物理磁盘上存储的文件,主要有数据文件和日志文件

以查询为例:
逻辑层接到应用层来的查询sql,立马开启一个线程对其进行处理
第一步查询处理器会对sql查询进行优化,之后生成执行计划,交给计划执行器
计划执行器访问更底层的事务管理器,存储管理器来操作数据
最终通过物理层的文件获取到查询结构信息,将结果响应给应用层

通过分析mysql的执行计划,可以大致判断你写的sql的快慢

使用:在select查询的前面加上explain,就可以看到这条查询语句的执行计划,比如:
explain select id,name from user where id = 123
执行完的结果分析:
执行结果有12列,挑重要的说:

select_type

代表查询类型,主要区分简单查询和各种复杂查询,可能的值有:
SIMPLE:简单SELECT(不使用UNION或子查询)

PRIMARY:最外面的SELECT

UNION:UNION中的第二个或后面的SELECT语句

DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT:UNION 的结果

SUBQUERY:子查询中的第一个SELECT

DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

DERIVED:导出表的SELECT(FROM子句的子查询)

从调优的角度看,我们一般要求这个只能是SIMPLE,也就是说所有的查询都是单表查询,拒绝子查询和表连接等复杂查询

type

访问类型,这个是执行计划中最能直接看出sql性能好坏的一个字段,可能的值有(从最优到最差排序):

system:表仅有一行(=系统表)。这是const联接类型的一个特例。

const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!

eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。

ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。

ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。

index_merge:该联接类型表示使用了索引合并优化方法。

unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。

index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)

range:只检索给定范围的行,使用一个索引来选择行。

index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

ALL:对于每个来自于先前的表的行组合,进行完整的表扫描,说明查询就需要优化了。

一般来说,得保证查询至少达到range级别,最好能达到ref。

猜你喜欢

转载自blog.csdn.net/java_zhangshuai/article/details/85173466