- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MYSQL 性能分析器 EXPLAIN 用法实例分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了mysql 性能分析器 explain 用法。分享给大家供大家参考,具体如下:
使用方法:
1
|
explain
select
*
from
user
;
|
环境和数据准备 。
1
2
3
4
5
6
7
8
|
-- 查看 mysql 版本
select
version();
-- mysql 提供什么存储引擎
show engines;
-- 查看默认存储引擎
show variables
like
'%storage_engine%'
;
|
输出结果:
id:输出的是整数,用来标识整个 sql 的执行顺序。id 如果相同,从上往下依次执行id不同;id 值越大,执行优先级越高,越先被执行;如果行引用其他行的并集结果,则该值可以为null 。
。
simple:简单的 select 查询,没有 union 或者子查询,包括单表查询或者多表 join 查询 。
primary: 最外层的 select 查询,常见于子查询或 union 查询 ,最外层的查询被标识为 primary 。
union:union 操作的第二个或之后的 select,不依赖于外部查询的结果集(外部查询指的就是 primary 对应的 select) 。
dependent union:union 操作的第二个或之后的 select,依赖于外部查询的结果集 。
union result:union 的结果(如果是 union all 则无此结果) 。
subquery:子查询中的第一个 select 查询,不依赖于外部查询的结果集 。
dependent subquery:子查询中的第一个select查询,依赖于外部查询的结 。
derived:派生表(临时表),常见于 from 子句中有子查询的情况 。
注意:mysql5.7 中对 derived table 做了一个新特性,该特性允许将符合条件的 derived table 中的子表与父查询的表合并进行直接join,从而简化简化了执行计划,同时也提高了执行效率;默认情况下,mysql5.7 中这个特性是开启的,所以默认情况下,上面的 sql 的执行计划应该是这样的 。
materialized:被物化的子查询,mysql5.6 引入的一种新的 select_type,主要是优化 from 或 in 子句中的子查询,更多详情请查看:optimizing subqueries with materialization 。
uncacheable subquery:对于外层的主表,子查询不可被缓存,每次都需要计算 。
uncacheable union:类似于 uncacheable subquery,只是出现在 union 操作中 。
simplle、primary、subquery、derived 这 4 个在实际工作中碰到的会比较多,看得懂这 4 个就行了,至于其他的,碰到了再去查资料就好了 。
table:显示了对应行正在访问哪个表(有别名就显示别名),还会有 <union2,3> 、 <subquery2> 、 <derived2> (这里的 2,3、2、2 指的是 id 列的值)类似的值 。
partitions:查询进行匹配的分区,对于非分区表,该值为null。大多数情况下用不到分区,所以这一列我们无需关注 。
。
关联类型或者访问类型,它指明了 mysql 决定如何查找表中符合条件的行,这是我们判断查询是否高效的重要依据,完整介绍请看:explain-join-types 。
system:该表只有一行(=系统表),是 const 类型的特例 。
const:确定只有一行匹配的时候,mysql 优化器会在查询前读取它并且只读取一次,速度非常快。用于 primary key 或 unique 索引中有常亮值比较的情形 。
eq_ref:对于每个来自于前面的表的行,从该表最多只返回一条符合条件的记录。当连接使用的索引是 primary key 或 unique not null 索引时使用,非常高效 。
ref:索引访问,也称索引查找,它返回所有匹配某个单个值的行。此类型通常出现在多表的 join 查询, 针对于非 unique 或非 primary key, 或者是使用了最左前缀规则索引的查询,换句话说,如果 join 不能基于关键字选择单个行的话,则使用ref 。
fulltext:当使用全文索引时会用到,这种索引一般用不到,会用专门的搜索服务(solr、elasticsearch等)来替代 。
ref_or_null:类似ref,但是添加了可以专门搜索 null 的行 。
这个是有前提条件的,前提为 weapon 列有索引,且 weapon 列存在 null 。
index_merge:该访问类型使用了索引合并优化方法 。
这个同样也是有条件的, id 列和 weapon 列都有单列索引。如果出现 index_merge,并且这类 sql 后期使用较频繁,可以考虑把单列索引换为组合索引,这样效率更高 。
unique_subquery:类似于两表连接中被驱动表的 eq_ref 访问方式,unique_subquery 是针对在一些包含 in 子查询的查询语句中,如果查询优化器决定将 in 子查询转换为 exists 子查询,而且子查询可以使用到主键或者唯一索引进行等值匹配时,则会使用 unique_subquery 。
index_subquery:index_subquery 与 unique_subquery类似,只不过访问子查询中的表时使用的是普通的索引 。
range:使用索引来检索给定范围的行,当使用 =、<>、>、>=、<、<=、is null、<=>、between 或者 in 操作符,用常量比较关键字列时,则会使用 rang,前提是必须基于索引,也就是 id 上必须有索引 。
index:当我们可以使用索引覆盖,但需要扫描全部的索引记录时,则会使用 index;进行统计时非常常见 。
all:我们熟悉的全表扫描 。
possible_keys:展示在这个 sql 中,可能用到的索引有哪些,但不一定在查询时使用。若为空则表示没有可以使用的索引,此时可以通过检查 where 语句看是否可以引用某些列或者新建索引来提高性能 。
key:展示这个 sql 实际使用的索引,如果没有选择索引,则此列为null,要想强制 mysql 使用或忽视 possible_keys 列中的索引,在查询中使用 force index、use index 或者i gnore index 。
key_len:展示 mysql 决定使用的键长度(字节数)。如果 key 是 null,则长度为 null。在不损失精确性的情况下,长度越短越好 。
ref:展示的是与索引列作等值匹配的东东是个啥,比如只是一个常数或者是某个列。它显示的列的名字(或const),此列多数时候为 null 。
rows:展示的是 mysql 解析器认为执行此 sql 时预计需要扫描的行数。此数值为一个预估值,不是具体值,通常比实际值小 。
filtered:展示的是返回结果的行数所占需要读到的行(rows 的值)的比例,当然是越小越好啦 。
。
表示不在其他列但也很重要的额外信息。取值有很多,我们挑一些比较常见的过一下 。
using index:表示 sql 使用了使用覆盖索引,而不用回表去查询数据,性能非常不错 。
using where:表示存储引擎搜到记录后进行了后过滤(post-filter),如果查询未能使用索引,using where 的作用只是提醒我们 mysql 要用 where 条件过滤结果集 。
using temporary:表示 mysql 需要使用临时表来存储结果集,常见于排序和分组查询 。
using filesort:表示 mysql 无法利用索引直接完成排序(排序的字段不是索引字段),此时会用到缓冲空间(内存或者磁盘)来进行排序;一般出现该值,则表示 sql 要进行优化了,它对 cpu 的消耗是比较大的 。
impossible where:查询语句的where子句永远为 false 时将会提示该额外信息 。
当然还有其他的,不常见,等碰到了大家再去查吧!!.
希望本文所述对大家MySQL数据库计有所帮助.
原文链接:https://blog.csdn.net/qq_42176520/article/details/103251935 。
最后此篇关于MYSQL 性能分析器 EXPLAIN 用法实例分析的文章就讲到这里了,如果你想了解更多关于MYSQL 性能分析器 EXPLAIN 用法实例分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。
我在 mysql 中使用如下命令。当它显示表格数据时,它被格式化为一个非常干净的表格,间距均匀且 |作为列分隔符。 SELECT * FROM TABLE_NAME; 当我从 CLI 运行命令时,如下
我知道这个问题之前已经被问过好几次了,我已经解决了很多问题,但到目前为止没有任何效果。 MySQL 试图将自身安装到的目录 (usr/local/mysql) 肯定有问题。关于我的错误的奇怪之处在于我
以下是我的 SQL 数据结构,我正在尝试如下两个查询: Select Wrk_ID, Wrk_LastName, Skill_Desc from Worker, Skill where
我们有一个本地 mysql 服务器(不在公共(public)域上),并希望将该服务器复制到我们拥有的 google 云 sql 实例。我的问题是:1.这可能吗?2.我们的本地服务器只能在本地网络上访问
我有一个表(test_table),其中一些字段值(例如字段 A、B 和 C)是从外部应用程序插入的,还有一个字段(字段 D),我想从现有表(store_table)插入其值,但在插入前者(A、B 和
我想创建一个 AWS RDS 实例,然后使用 terraform 管理数据库用户。因此,首先,我创建了一个 RDS 实例,然后使用创建的 RDS 实例初始化 mysql 提供程序,以进一步将其用于用户
当用户在我的网站上注册时,他们会在我的一个数据库中创建自己的表格。该表存储用户发布的所有帖子。我还想做的是也为他们生成自己的 MySql 用户——该用户仅有权从他们的表中读取、写入和删除。 创建它应该
我有一个关于 ColdFusion 和 Mysql 的问题。我有两个表:PRODUCT 和 PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1 的特殊产品的类别。所以我写了这个
我想获取 recipes_id 列的值,以获取包含 ingredient_id 的 2,17 和 26 条目的值。 假设 ingredient_id 2 丢失则不获取记录。 我已经尝试过 IN 运算符
在 Ubuntu 中,我通常安装两者,但 MySQL 的客户端和服务器之间有什么区别。 作为奖励,当一个新语句提到它需要 MySQL 5.x 时,它是指客户端、服务器还是两者兼而有之。例如这个链接ht
我重新访问了我的数据库并注意到我有一些 INT 类型的主键。 这还不够独特,所以我想我会有一个指导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自
我的系统上有 MySQL,我正在尝试确定它是 Oracle MySQL 还是 MySQL。 Oracle MySQL 有区别吗: http://www.oracle.com/us/products/m
我是在生产 MySQL 中运行的应用程序的新维护者。之前的维护者已经离开,留下的文档很少,而且联系不上了。 我面临的问题是执行以下请求大约需要 10 秒: SELECT COUNT(*) FROM `
我有两个位于不同机器上的 MySQL 数据库。我想自动将数据从一台服务器传输到另一台服务器。比方说,我希望每天早上 4:00 进行数据传输。 可以吗?是否有任何 MySQL 内置功能可以让我们做到这一
有什么方法可以使用 jdbc 查询位于 mysql 根目录之外的目录中的 mysql 表,还是必须将它们移动到 mysql 根目录内的数据库文件夹中?我在 Google 上搜索时没有找到任何东西。 最
我在 mysql 数据库中有两个表。成员和 ClassNumbers。两个表都有一个付费年份字段,都有一个代码字段。我想用代码数字表中的值更新成员表中的付费年份,其中成员中的代码与 ClassNumb
情况:我有 2 台服务器,其中一台当前托管一个实时 WordPress 站点,我希望能够将该站点转移到另一台服务器,以防第一台服务器出现故障。传输源文件很容易;传输数据库是我需要弄清楚如何做的。两台服
Phpmyadmin 有一个功能是“复制数据库到”..有没有mysql查询来写这个函数?类似于将 db A 复制到新的 db B。 最佳答案 首先创建复制数据库: CREATE DATABASE du
我有一个使用 mySQL 作为后端的库存软件。我已经在我的计算机上对其进行了测试,并且运行良好。 当我在计算机上安装我的软件时,我必须执行以下步骤: 安装 mySQL 服务器 将用户名指定为“root
我是一名优秀的程序员,十分优秀!