这篇文章主要介绍MySql中怎么使用解释查询SQL的执行计划,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
解释命令是查看查询优化器如何决定执行查询的主要方法。
这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的。
<强> 1,什么是MySql执行计划强>
,,,,,,要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。
,,,,,,,MySQL本身的功能架构分为三个部分,分别是应用层,逻辑层,物理层,不只是MySQL,其他大多数数据库产品都是按这种架构来进行划分的。
应用层,主要负责与客户端进行交互,建立链接,记住链接状态,返回数据,响应请求,这一层是和客户端打交道的。
逻辑层,主要负责查询处理,事务管理等其他数据库功能处理,以查询为例只,,,,,,,
,,,,,,,首先接收到查询SQL之后,数据库会立即分配一个线程对其进行处理,第一步查询处理器会对SQL查询进行优化,优化后会生成执行计划,然后交由计划执行器来执行。
,,,,,,,计划执行器需要访问更底层的事务管理器,存储管理器来操作数据,他们各自的分工各有不同,最终通过调用物理层的文件获取到查询结构信息,将最终结果响应给应用层。
物理层,实际物理磁盘上存储的文件,主要有分文数据文件,日志文件只,,
,,,,,,,通过上面的描述,生成执行计划是执行一条SQL必不可少的步骤,一条SQL性能的好坏,可以通过查看执行计划很直观的看出来,执行计划提供了各种查询类型与级别,方面我们进行查看以及为作为性能分析的依据只
<强> 2,如何分析执行计划强>
,,,,MySQL为我们提供了解释关键字来直观的查看一条SQL的执行计划。
,,,,解释显示了MySQL如何使用索引来处理选择语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。
,,,,,下面我们使用解释做一个查询,如下:
mysql>, explain select *,得到支付; + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | |,id select_type |, table |, partitions |, type |, possible_keys |, key |, key_len |, ref |, rows |, filtered | Extra | + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + |,1,|,SIMPLE , |, payment |, NULL , |, ALL |, NULL ,, |, NULL |, NULL |, NULL |, 16086, |, 100.00, |, NULL | + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1,row 集,拷贝,1,warning (0.01, sec)
,,,,,,,查询结构中有12列,理解每一列的含义,对理解执行计划至关重要,下面用一个表格的形式进行说明。
列名说明idSELECT识别符,这是选择的查询序列号.select_type选择类型,可以为以下任何一种:
- <李>
简单:简单选择(不使用联盟或子查询)
李> <李>主:最外面的选择
李> <李>工会:工会中的第二个或后面的选择语句
李> <李>依赖工会:工会中的第二个或后面的选择语句,取决于外面的查询
李> <李>联盟结果:联盟的结果
李> <李>子查询:子查询中的第一个选择
李> <李>相关子查询:子查询中的第一个选择、取决于外面的查询
李> <李>派生:导出表的选择(从子句的子查询)
李>联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
- <李>
系统:表仅有一行(=系统表)。这是const联接类型的一个特例。
李> <李>const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数.const表很快,因为它们只读取一次!null