繁体   English   中英

MySQL 8.x 的解释 JSON 格式是否正常工作?

Is MySQL 8.x's Explain JSON Format Working Properly?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我一直在尝试阅读 MySQL 8.0.30 执行计划,但我无法对它做出正面或反面。

有问题的测试查询(参见db<>fiddle )是:

select *
from (
  select t.a from t join u on u.b = t.a and u.b >= 50
) x
left join (
  select v.c from v join w on w.d = v.c and v.c <= 500
) y on y.c <= x.a

首先,我得到了它的“树格式”,这对我来说很有意义:

-> Left hashwhich join (no condition), extra conditions: (v.c <= t.a) (cost=8.06 rows=40)
    -> Inner hash join (t.a = u.b) (cost=1.30 rows=1)
        -> Table scan on t (cost=0.26 rows=3)
        -> Hash
            -> Filter: (u.b >= 50) (cost=0.65 rows=1)
                -> Table scan on u (cost=0.65 rows=4)
    -> Hash
        -> Filter: ((v.c <= 500) and (w.d = v.c)) (cost=3.81 rows=30)
            -> Inner hash join (no condition) (cost=3.81 rows=30)
                -> Table scan on w (cost=0.13 rows=6)
                -> Hash
                    -> Table scan on v (cost=0.56 rows=5)

然后,我得到了相同查询的“JSON 格式”:

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "6.47"
    },
    "nested_loop": [
      {
        "table": {
          "table_name": "u",
          "access_type": "ALL",
          "rows_examined_per_scan": 4,
          "rows_produced_per_join": 1,
          "filtered": "33.33",
          "cost_info": {
            "read_cost": "0.52",
            "eval_cost": "0.13",
            "prefix_cost": "0.65",
            "data_read_per_join": "10"
          },
          "used_columns": [
            "b"
          ],
          "attached_condition": "(`fiddle`.`u`.`b` >= 50)"
        }
      },
      {
        "table": {
          "table_name": "t",
          "access_type": "ALL",
          "rows_examined_per_scan": 3,
          "rows_produced_per_join": 1,
          "filtered": "33.33",
          "using_join_buffer": "hash join",
          "cost_info": {
            "read_cost": "0.25",
            "eval_cost": "0.13",
            "prefix_cost": "1.30",
            "data_read_per_join": "10"
          },
          "used_columns": [
            "a"
          ],
          "attached_condition": "(`fiddle`.`t`.`a` = `fiddle`.`u`.`b`)"
        }
      },
      {
        "table": {
          "table_name": "v",
          "access_type": "ALL",
          "rows_examined_per_scan": 5,
          "rows_produced_per_join": 6,
          "filtered": "100.00",
          "using_join_buffer": "hash join",
          "cost_info": {
            "read_cost": "0.25",
            "eval_cost": "0.67",
            "prefix_cost": "2.22",
            "data_read_per_join": "53"
          },
          "used_columns": [
            "c"
          ],
          "attached_condition": "<if>(is_not_null_compl(v..w), ((`fiddle`.`v`.`c` <= `fiddle`.`t`.`a`) and (`fiddle`.`v`.`c` <= 500)), true)"
        }
      },
      {
        "table": {
          "table_name": "w",
          "access_type": "ALL",
          "rows_examined_per_scan": 6,
          "rows_produced_per_join": 39,
          "filtered": "100.00",
          "using_join_buffer": "hash join",
          "cost_info": {
            "read_cost": "0.25",
            "eval_cost": "4.00",
            "prefix_cost": "6.47",
            "data_read_per_join": "319"
          },
          "used_columns": [
            "d"
          ],
          "attached_condition": "<if>(is_not_null_compl(v..w), (`fiddle`.`w`.`d` = `fiddle`.`v`.`c`), true)"
        }
      }
    ]
  }
}

即使是同一个查询,这些计划在结构上看起来也不同。 在第一个中,我可以看到以树形式链接的运算符,而在 JSON 格式中,它们看起来都扁平化在同一级别——在单个“nested_loop”运算符内。

第一种格式(树)清楚地显示了两个执行分支,而第二种格式(JSON)显示了单个平面执行序列

简而言之,谁在说真话,谁在说谎?

问题暂未有回复.您可以查看右边的相关问题.
3 MySQL 8.x 中的主要错误? — 外键

在从 MySQL 检索外键信息(用于代码生成器)时,我注意到了这种奇怪的行为。 它看起来像是 MySQL 8.x 中的一个主要错误。 当我使用REFERENCES创建外键时,引擎不会强制执行它。 例如: 请参阅DB Fiddle 中的示例。 但是,如果我创建输入FOREIGN KEY (col ...

5 mySQL 8.x 之前的堆栈溢出“解决方案”不起作用?

您好,感谢您提供的任何帮助。 我在共享服务器平台上运行,因此我只能使用 mySQL 版本 5.6.46,这意味着我无权访问“递归 CTE”和“WITH”命令。 经过数小时寻找如何执行递归类型操作的解决方案 - 在尝试了许多最终无效的方法之后 - 我发现这个 Stack Overflow 参考了一种 ...

2020-02-18 09:02:33 0 28   mysql
6 如何使用Java 10连接到MySQL8.x数据库?

首先,对不起我的英语不好。 我在基础中有方案和表,我想建立连接。 1)方案名称-用户。 2)用户名-根3)密码-香蕉。 我通过使用MySQL的教程编写了这段代码 但是代码抛出异常 我使用标准的java.sql库,但无法理解我做错了什么... ...

9 MySQL 8:JSON_TABLE无法正常工作

在MySQL 8.0.4和更高版本中,有一个名为“ JSON_TABLE ”的函数。 我尝试了来自官方mysql文档的示例,但JSON_TABLE返回了错误: 错误1142(42000):用户'test'@'127.0.0.1'的表'json_table'的SELECT命令被拒 ...

10 解释子查询工作的MySQL

编写查询以显示书籍代码,书籍标题,供应商名称和书籍价格,这取决于每个供应商的最高价格。 我发现以下查询可以得到正确的结果,但需要说明 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM