描述
该语句用于解释 SQL 语句的执行计划,可以是 SELECT、DELETE、INSERT、REPLACE 或 UPDATE 语句。
EXPLAIN 与 DESCRIBE、DESC 互为同义词。
语法
/*获取表或列的信息*/
{EXPLAIN | DESCRIBE | DESC} table_name [column_name];
/*获取 SQL 计划信息*/
{EXPLAIN | DESCRIBE | DESC} [explain_type] dml_statement;
explain_type:
BASIC
| OUTLINE
| EXTENDED
| EXTENDED_NOADDR
| PARTITIONS
| FORMAT = {TRADITIONAL| JSON}
dml_statement:
SELECT statement
| DELETE statement
| INSERT statement
| UPDATE statement
| MERGE statement
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定表的列名。 |
| explain_type | 指定解释类型。 |
| BASIC | 指定输出计划的基础信息,例如算子 ID、算子名称、所引用的表名。 |
| OUTLINE | 指定输出的计划信息包含 Outline 信息。 |
| EXTENDED | EXPLAIN 产生附加信息,包括每个算子的输入列和输出列、访问表的分区信息、当前使用的filter信息。如果当前算子使用了索引,显示所使用的索引列及抽取的 Query Range。 |
| EXTENDED_NOADDR | 以简约的方式展示附加信息。 |
| PARTITIONS | 显示分区相关信息。 |
| TRADITIONAL | JSON | 指定 EXPALIN 的输出格式。
|
| dml_statement | DML 声明。 |
示例
创建示例表 tbl1 和 tbl2。
obclient>CREATE TABLE tbl1(col1 INT,col2 INT);
Query OK, 0 rows affected
obclient>CREATE TABLE tbl2(col1 INT,col2 INT);
Query OK, 0 rows affected
获取表
tbl1的信息。obclient> EXPLAIN tbl1; +-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | COL1 | NUMBER(38) | YES | NULL | NULL | NULL | | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in set获取表
tbl2的列col2的信息。obclient> EXPLAIN tbl2 col2; +-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+------------+------+-----+---------+-------+ 1 row in set省略
explain_type,返回SELECT语句的执行计划信息。obclient> EXPLAIN SELECT * FROM tbl1,tbl2 WHERE tbl1.col2=tbl2.col2 AND tbl2.col1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |2442404| |1 | TABLE SCAN|TBL2|10000 |40790 | |2 | TABLE SCAN|TBL1|100000 |38681 | ======================================= Outputs & filters: ------------------------------------- 0 - output([TBL1.COL1], [TBL1.COL2], [TBL2.COL1], [TBL2.COL2]), filter(nil), equal_conds([TBL1.COL2 = TBL2.COL2]), other_conds(nil) 1 - output([TBL2.COL2], [TBL2.COL1]), filter([TBL2.COL1 > 4]), access([TBL2.COL2], [TBL2.COL1]), partitions(p0) 2 - output([TBL1.COL2], [TBL1.COL1]), filter(nil), access([TBL1.COL2], [TBL1.COL1]), partitions(p0) 1 row in set通过
EXTENDED_NOADDR关键字输出附加信息。obclient> EXPLAIN EXTENDED_NOADDR SELECT * FROM tbl1,tbl2 WHERE tbl1.col2=tbl2.col2 AND tbl2.col1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |2442404| |1 | TABLE SCAN|TBL2|10000 |40790 | |2 | TABLE SCAN|TBL1|100000 |38681 | ======================================= Outputs & filters: ------------------------------------- 0 - output([TBL1.COL1], [TBL1.COL2], [TBL2.COL1], [TBL2.COL2]), filter(nil), equal_conds([TBL1.COL2 = TBL2.COL2]), other_conds(nil) 1 - output([TBL2.COL2], [TBL2.COL1]), filter([TBL2.COL1 > 4]), access([TBL2.COL2], [TBL2.COL1]), partitions(p0), is_index_back=false, filter_before_indexback[false], range_key([TBL2.__pk_increment]), range(MIN ; MAX)always true 2 - output([TBL1.COL2], [TBL1.COL1]), filter(nil), access([TBL1.COL2], [TBL1.COL1]), partitions(p0), is_index_back=false, range_key([TBL1.__pk_increment]), range(MIN ; MAX)always true 1 row in set展示
TRADITIONAL格式的INSERT语句执行计划。obclient> EXPLAIN FORMAT=TRADITIONAL INSERT INTO TBL1 VALUES(1,1)\G *************************** 1. row *************************** Query Plan: ==================================== |ID|OPERATOR |NAME|EST. ROWS|COST| ------------------------------------ |0 |INSERT | |1 |1 | |1 | EXPRESSION| |1 |1 | ==================================== Outputs & filters: ------------------------------------- 0 - output([column_conv(BIGINT UNSIGNED,PS:(-1,-1),NOT NULL,nextval(1))], [column_conv(NUMBER,PS:(38,0),NULL,__values.COL1)], [column_conv(NUMBER,PS:(38,0),NULL,__values.COL2)]), filter(nil), columns([{TBL1: ({TBL1: (TBL1.__pk_increment, TBL1.COL1, TBL1.COL2)})}]), partitions(p0) 1 - output([__values.COL1], [__values.COL2]), filter(nil) values({1, 1}) 1 row in set展示
JSON格式的SELECT语句执行计划。obclient> EXPLAIN FORMAT=JSON SELECT * FROM tbl1,tbl2 WHERE tbl1.col2=tbl2.col2 AND tbl2.col1 > 4\G *************************** 1. row *************************** Query Plan: { "ID":2, "OPERATOR":"JOIN", "NAME":"JOIN", "EST.ROWS":9800999, "COST":2442403, "output": [ "TBL1.COL1", "TBL1.COL2", "TBL2.COL1", "TBL2.COL2" ], "CHILD_1": { "ID":0, "OPERATOR":"TABLE SCAN", "NAME":"TABLE SCAN", "EST.ROWS":10000, "COST":40789, "output": [ "TBL2.COL2", "TBL2.COL1" ] }, "CHILD_2": { "ID":1, "OPERATOR":"TABLE SCAN", "NAME":"TABLE SCAN", "EST.ROWS":100000, "COST":38680, "output": [ "TBL1.COL2", "TBL1.COL1" ] } } 1 row in set
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




