当前位置:网站首页>Mysql Explain
Mysql Explain
2022-08-04 16:00:00 【allway2】
MySQL 优化器根据成本计算使用哪种执行计划运行查询时的成本,从而选择成本最低的查询。由于这是估计值,因此在执行之前无法准确知道确切的成本。
EXPLAIN
EXPLAIN 是 MySQL 服务器在想知道要执行哪些查询(即执行计划是什么)时使用的基本命令。从 5.6 开始,也可以输出 JSON 格式的查询。您还可以将其可视化为与 MySQL 工作相结合。我们将在下面介绍这一部分。
表格结构
EXPLAIN
让我们看一下之前的 ERD。member 是会员信息,订单列表是订单列表,交易是该订单的交易信息。
EXPLAIN 结果
EXPLAIN 是 MySQL 服务器在想知道要执行哪些查询(即执行计划是什么)时使用的基本命令。从 5.6 开始,JSON 格式的输出也变得可用
1 2 3 4 5 | explain select m.*, o.*, t.* from member m inner join orders o on m.id = o.member_id inner join transaction t on o.transaction_id = t.id where m.id in (1, 2, 33) |
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
‘1’ | ‘SIMPLE’ | ‘m’ | NULL | ‘range’ | ‘PRIMARY’ | ‘PRIMARY’ | ‘8’ | NULL | ‘3’ | ‘100.00’ | ‘Using where’ |
‘1’ | ‘SIMPLE’ | ‘o’ | NULL | ‘ref’ | ‘FKpktxw…’ | ‘FKpktxw…’ | ‘8’ | ‘sample.m.id’ | ‘90’ | ‘100.00’ | NULL |
‘1’ | ‘SIMPLE’ | ‘t’ | NULL | ‘eq_ref’ | ‘PRIMARY’ | ‘PRIMARY’ | ‘8’ | ‘sample.o.transaction_id’ | ‘1’ | ‘100.00’ | NULL |
table
显示对哪个表的访问显示在表字段中。
id
id 表示附加到 SELECT 的号码。由于 MySQL 将联接作为一个单元运行,因此标识是标识该查询的执行单元。因此,在仅执行联接的查询中,标识始终为 1。
select_type
select_type始终为 SIMPLE。即使进行复杂的联接,也会成为 SIMPLE。如果存在子夸里或 UNION,则 id 和select_type会发生变化。
partitions
分区是分区时使用的字段。由于此查询中使用的所有表都不是分区表,因此此字段全部输出为 NULL。如果分区,请务必检查此字段。
type
类型是表示方法的字段。该方法指向如何从表中获取行数据。在上面的 EXPLAIN 中,有 ALL、eq_ref、ref ALL、eq_ref使用联接时的主键或唯一键访问一个值(仅精确修补最多一行),ref 是指可能修补多行的访问。方法对于确定访问目标表是否有效至关重要。
在这些方法中,需要注意的是ALL、索引和ref_or_null。ALL 和 index 两种情况是,由于表或特定索引接近整行,因此表大小较大时效率较低。对于ref_or_null,包含 NUL 的行存储在索引的前面,但如果数量较多,MySQL 服务器的工作量就会变大。换句话说,除 ALL 以外的所有方法都使用索引。
如果方法为 ALL 或 index,这可能意味着没有适当的索引可用于该查询。在上面的查询中,对计数表的访问是 ALL,但这是因为 WHERE 未指定短语的条件。如果从此类查询访问驾驶表,则只能扫描整行。
方法 | 描述 |
---|---|
const | loockup(等值比较)由主键或唯一键,如何接近最外部的表,而不是联接,结果始终为第 1 行。但是,由于您使用的是主键和唯一键,因此,如果将其指定为范围搜索,则不会成为 const。 |
system | 如果表中只有第 1 行,则采用特殊方法 |
ALL | 整行扫描,访问表中的整个数据。 |
index | 索引扫描,接近表的特定索引的完整条目。 |
eq_ref | 当联接访问到内部表时,主键或共享键将发生 lookup。与 const 类似,但访问联接的内部表是不同的 |
ref | 等价比较索引不是唯一键,可以访问多个行。 |
ref_or_null | 与 ref 一样,在索引访问中搜索存储在最前面的 NULL 条目。 |
range | 索引接近特定范围的行 |
fulltext | 使用全文本索引进行搜索 |
index_merge | 使用多个个人助手获取行并合并结果。 |
unique_subquery | 在 IN 子查询方法中使用主键或唯一键。这种方法通过减少无用的开销而相当快。 |
index_subquery | 它与unique_sunquery几乎相同,但不同之处在于它不使用唯一的索引。这种方法也相当快 |
possible_keys
possible_keys字段是可用索引的列表。
key
possible_keys字段实际上是 Optimimer 从可用索引列表中选择的索引的 key。在上面的 EXPLAN 中,County 表(第一行)中的键为 NULL,这意味着索引不能用于获取行数据。
key_len
key_len字段是指所选索引的长度。虽然这不是重要的字段,但请记住,索引过长也是低效的。
rows
rows 使用此方法来指示导入了多少行。对于最初访问的表,显示整个查询访问的行数,然后表的平均访问几行作为第 1 行的联接。但是,它与实际行数不一定匹配,因为它是作为统计值计算的。
filtered
filtered 获取行数据,并指示在应用 WHERE 短语的搜索条件时,在居耳中还剩多少行。此值也是根据统计值计算得出的值,因此不一定与实际值匹配。
extra
Extra 字段是一个提示,告诉我们优化器的行为。此字段对于使用 EXPLAN 确定优化器的行为非常重要。
额外 | 描述 |
---|---|
使用位置 | 描述该方法,显示从表中导入行后,通过应用其他搜索条件缩小行范围。 |
使用索引 | 表意味着只通过仅从索引访问来解决四元性,而不是访问它。处理为覆盖索引,也称为索引计算 |
对分组依据使用索引 | 与 Using 索引类似,但表示包含 GROUP BY 的查询可以通过覆盖索引解决 |
使用文件排序 | ORDER 表示未解析为 BY 索引,并且按查找器 (MySQL 的查询)对行进行排序。 |
使用临时 | 隐式指示临时表已创建。 |
使用推力的位置 | 显示发动机状态的推子优化已发生。目前仅 NDB 有效 |
使用索引条件 | 指示索引状态推送 (ICP) 优化已发生。ICP 计划使用索引,即使多列索引未按从左到右的顺序指定列也是如此。 |
使用磁共振 | 指示已使用多范围引线 (MRR) 优化。 |
使用连接缓冲区(块嵌套循环) | 指示联接没有适当的索引,因此使用了联接缓冲区。 |
使用联接缓冲区(批处理密钥访问) | 指示已使用联接缓冲区进行备份密钥访问 (BKAJ) 算法。 |
JSON 格式 EXPLAIN
1 2 3 4 5 | explain format = json select m.*, o.*, t.* from member m inner join orders o on m.id = o.member_id inner join transaction t on o.transaction_id = t.id where m.id in (1, 2, 33) |
与传统表格相比,JSON 格式的 EXPLAIN 具有许多输出信息。从 5.7 开始,它提供了有关成本的信息,与表格格式相比更方便。对于 JOSN 格式的 EXPLAIN,在 Extra 字段中,仅输出为 Using WHERE attached_condition,以便具体了解适用的条件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | { "query_block": { "select_id": 1, "cost_info": { "query_cost": "449.03" }, "nested_loop": [ { "table": { "table_name": "m", "access_type": "range", "possible_keys": [ "PRIMARY" ], "key": "PRIMARY", "used_key_parts": [ "id" ], "key_length": "8", "rows_examined_per_scan": 3, "rows_produced_per_join": 3, "filtered": "100.00", "cost_info": { "read_cost": "3.61", "eval_cost": "0.60", "prefix_cost": "4.21", "data_read_per_join": "6K" }, "used_columns": [ "id", "email", "name" ], "attached_condition": "(`sample`.`m`.`id` in (1,2,33))" } }, { "table": { "table_name": "o", "access_type": "ref", "possible_keys": [ "FKpktxwhj3x9m4gth5ff6bkqgeb", "FKrylnffj7sn97iepyqadlfnsg0" ], "key": "FKpktxwhj3x9m4gth5ff6bkqgeb", "used_key_parts": [ "member_id" ], "key_length": "8", "ref": [ "sample.m.id" ], "rows_examined_per_scan": 90, "rows_produced_per_join": 272, "filtered": "100.00", "cost_info": { "read_cost": "63.00", "eval_cost": "54.55", "prefix_cost": "121.76", "data_read_per_join": "279K" }, "used_columns": [ "id", "order_number", "member_id", "transaction_id" ] } }, { "table": { "table_name": "t", "access_type": "eq_ref", "possible_keys": [ "PRIMARY" ], "key": "PRIMARY", "used_key_parts": [ "id" ], "key_length": "8", "ref": [ "sample.o.transaction_id" ], "rows_examined_per_scan": 1, "rows_produced_per_join": 272, "filtered": "100.00", "cost_info": { "read_cost": "272.73", "eval_cost": "54.55", "prefix_cost": "449.03", "data_read_per_join": "820K" }, "used_columns": [ "id", "code", "partner_transaction_id", "payment_method_type" ] } } ] } } |
Visual Explain
借助 MySQL 工作,您可以充分利用可视化扩展。以最直观的方式查看 Explain。
边栏推荐
- 使用百度EasyDL实现森林火灾预警识别
- codeforces:808D. Array Division【二分 + 找规律】
- Projector reached the party benefits 】 【 beginners entry - brightness projection and curtain selection - from entry to the master
- 视频字幕API接口文档
- 线上一次JVM FullGC搞得整晚都没睡,彻底崩溃
- DevOps平台中的制品库是什么?有什么用处?
- Jenkins 如何玩转接口自动化测试?
- dot net double 数组转 float 数组
- 现代 ABAP 编程语言中的正则表达式
- Typora收费?搭建VS Code MarkDown写作环境
猜你喜欢
多商户商城系统功能拆解24讲-平台端分销会员
postman “header“:{“retCode“:“999999“
ITSM软件与工单系统的区别是什么?
张乐:研发效能的黄金三角及需求与敏捷协作领域的实践
屏幕分辨率兼容性
【打卡】广告-信息流跨域ctr预估(待更新)
In action: 10 ways to implement delayed tasks, with code!
Real-Time Rendering 4th related resource arrangement (no credit required)
如何实时监控销售数据?销售看板来帮你!
成功 解决 @keyup.enter=“search()“ 在el-input 组件中不生效的问题
随机推荐
面了三十个人,说说真实感受
[TA-Frost Wolf_may-"Hundred Talents Project"] Art 2.7 Metallic and Speculer Process
NFT blind box mining system dapp development NFT chain game construction
软件性能测试包括哪些内容?国内权威软件检测机构排名
第三章 Scala运算符
微信小程序获取年月日周及早上、中午、晚上
seaborn
A detailed explanation of what is software deployment
张乐:研发效能的黄金三角及需求与敏捷协作领域的实践
In action: 10 ways to implement delayed tasks, with code!
一文详解什么是软件部署
UWP WPF 解决 xaml 设计显示异常
Tomato assistant downloading tomatoes
实战:10 种实现延迟任务的方法,附代码!
H5 之 文件流转base64下载
【Pick-in】Advertising-information flow cross-domain CTR estimation (to be updated)
ICDE‘22推荐系统论文之Research篇
云存储硬核技术内幕——(10)
qt 复杂界面信号槽设计
寻找消失的类名