代码之家  ›  专栏  ›  技术社区  ›  The Impaler

MySQL 8执行计划不完整

  •  3
  • The Impaler  · 技术社区  · 6 年前

    我想在MySQL 8.0中得到一个查询的执行计划,但是它给了我一个 计划。

    create table branch (
      id int primary key not null,
      name varchar(30) not null
    );
    insert into branch (id, name) values (101, 'California');
    insert into branch (id, name) values (102, 'Ohio');
    insert into branch (id, name) values (103, 'Delaware');
    
    create table account (
      id int primary key not null auto_increment,
      balance int
    );
    insert into account (id, balance) values (1001, 120);
    insert into account (id, balance) values (1004, 500);
    insert into account (id, balance) values (1005, 45);
    
    create table transaction (
      tx_id int primary key not null auto_increment,
      account_id int not null,
      amount int not null,
      branch_id int references branch (id)
    );
    insert into transaction (account_id, amount, branch_id) values
      (1001,  10, 101),
      (1001, 150, 101),
      (1001, 200, 101),
      (1001, -70, 102),
      (1001, -20, 102),
      (1001,-150, 102),
      (1004,  50, 103),
      (1004, 300, 101),
      (1004, 150, 102),
      (1005, 100, 102),
      (1005, -55, 101);
    

    现在的查询是:

    explain
    select *
    from account a
      join transaction t4 on t4.account_id = a.id
      join branch b5 on b5.id = t4.branch_id
      join (select account_id as account_id from transaction t7 where amount > 0) t6
        on t6.account_id = a.id
      where a.balance < 7 * (
        select avg(amount) from transaction t
          join branch b on b.id = t.branch_id
          where t.account_id = a.id
            and b.name in (select name from branch b7
                           where name like '%a%')
      )
      and a.balance < 5 * (
        select max(amount)
          from transaction t2
          join branch b2 on b2.id = t2.branch_id
          where b2.name not in (select name from branch b8
                                where name like '%i%')
      );
    

    现在显示(传统计划):

    id select_type         table type   key     key_len ref rows filtered Extra
    -- ------------------- ----- ------ ------- ------- --- ---- -------- -----
    1  PRIMARY             a     ALL                        3    33.33    Using where
    1  PRIMARY             t7    ALL                        11   9.09     Using where
    1  PRIMARY             t4    ALL                        11   10       Using where
    1  PRIMARY             b5    eq_ref PRIMARY 4       ... 1    100      
    5  SUBQUERY            b2    ALL                        3    100      Using where
    5  SUBQUERY            t2    ALL                        11   10       Using where
    6  DEPENDENT SUBQUERY  b8    ALL                        3    33.33    Using where
    3  DEPENDENT SUBQUERY  b7    ALL                        3    33.33    Using where
    3  DEPENDENT SUBQUERY  t     ALL                        11   10       Using where
    3  DEPENDENT SUBQUERY  b     eq_ref PRIMARY 4       ... 1    33.33    Using where
    

    它现在显示除标量子查询以外的所有表的信息 t6 . 它在哪里?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Bill Karwin    6 年前

    我试着测试你的查询,但是我在任何表中都没有行。EXPLAIN显示了“在读取const表之后不可能注意到的地方”,这意味着没有满足查询条件的行。

    join (select max(account_id) as account_id from transaction t7) t6 
        on t6.account_id = a.id
    

    +----+--------------------+-------+------+---------------+------+---------+------+------+-------------------------------------------------------------------+
    | id | select_type        | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                                             |
    +----+--------------------+-------+------+---------------+------+---------+------+------+-------------------------------------------------------------------+
    |  1 | PRIMARY            | a     | ALL  | PRIMARY       | NULL | NULL    | NULL |    1 | Using where                                                       |
    |  1 | PRIMARY            | t4    | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where; Using join buffer (Block Nested Loop)                |
    |  1 | PRIMARY            | b5    | ALL  | PRIMARY       | NULL | NULL    | NULL |    2 | Using where; Using join buffer (Block Nested Loop)                |
    |  4 | SUBQUERY           | t2    | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL                                                              |
    |  4 | SUBQUERY           | b2    | ALL  | PRIMARY       | NULL | NULL    | NULL |    2 | Using where; Using join buffer (Block Nested Loop)                |
    |  5 | DEPENDENT SUBQUERY | b8    | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where                                                       |
    |  2 | DEPENDENT SUBQUERY | t     | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where                                                       |
    |  2 | DEPENDENT SUBQUERY | b     | ALL  | PRIMARY       | NULL | NULL    | NULL |    2 | Using where; Using join buffer (Block Nested Loop)                |
    |  2 | DEPENDENT SUBQUERY | b7    | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where; FirstMatch(b); Using join buffer (Block Nested Loop) |
    +----+--------------------+-------+------+---------------+------+---------+------+------+-------------------------------------------------------------------+
    

    我没有像我在表中猜测的那样创建任何索引,所以这个解释没有显示任何优化。但至少所有相关名称都出现了。