EXPLAIN

当您需要优化查询语句时,例如查看查询是否有效的使用了索引,您可以通过EXPLAIN语句展示查询语句的执行计划。本文介绍如何使用EXPLAIN语句来展示您的查询计划。

引擎与版本

  • EXPLAIN语句适用于宽表引擎和时序引擎。

  • 宽表引擎从2.6.3版本开始支持不同深度的查询计划。

语法

explain_statement         ::= EXPLAIN [ PLAN ] [ explain_depth_expression ] 
                              [ FOR ] select_statement;
explain_depth_expression  ::= { WITH TYPE | WITHOUT IMPLEMENTATION }

使用说明

计划深度(explain_depth_expression)

重要

要求Lindorm SQL为2.6.4及以上版本。如何查看Lindorm SQL的版本,请参见SQL版本说明

EXPLAIN语句展示的查询计划分为三个深度,其说明和指定方法如下:

深度

深度表达式

说明

物理计划

不指定

已经经过优化器优化选择后的最终物理计划。

逻辑计划

WITHOUT IMPLEMENTATION

仅生成该查询未经优化的逻辑计划。

类型计划

WITH TYPE

仅生成该查询的返回结果集中的数据行的每一列的类型。

选择语句(select_statement)

语法中的select_statement即为Lindorm中SQL支持的查询语句。

示例

示例表test的结构如下:

CREATE TABLE test (
    p1 VARCHAR(255) NOT NULL,
    c1 VARCHAR(255),
    PRIMARY KEY (p1)
);

部分列写入数据:

INSERT INTO test (p1, c1) VALUES
('3abc9378', '10'),
('3def9378', NULL),
('3ghi1234', '15'),
('3jkl5678', NULL),
('3mno9378', '20'),
('3pqr0000', '25'),
('3stu9378', '30'),
('3vwx0000', NULL),
('3yz_9378', '35'),
('3_1239378', '40');

以下示例展示了对同一条查询语句获取不同深度的查询计划的方式。

生成物理计划

EXPLAIN SELECT POSITION('9378' IN p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;

生成逻辑计划

EXPLAIN WITHOUT IMPLEMENTATION FOR SELECT POSITION('9378' IN p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;

生成类型计划​​

EXPLAIN WITH TYPE FOR SELECT POSITION('9378' IN p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;