Подтвердить что ты не робот

Что такое эквивалент MySQL PostgreSQL EXPLAIN ANALYZE

Я хотел бы получить подробный план запроса в MySQL, подобный показаниям EXPLAIN ANALYZE в PostgreSQL. Существует ли эквивалент?

4b9b3361

Ответ 2

Я не использовал PostgreSQL до того, как MySQL имеет EXPLAIN EXTENDED, который дает больше информации, чем EXPLAIN, и может предоставить вам информацию, которую вы ищете.

Ответ 3

EXPLAIN EXTENDED

MariaDB/MySQL предоставляет что-то, называемое EXPLAIN EXTENDED. Однако не существует замены EXPLAIN ANALYZE. EXPLAIN EXTENDED не содержит никакой информации о времени, а внутренний пробой гораздо менее подробный.

Name: 'EXPLAIN'
Description:
Syntax:
EXPLAIN [explain_type] SELECT select_options

explain_type:
    EXTENDED
  | PARTITIONS

Or:

EXPLAIN tbl_name

The EXPLAIN statement can be used either as a way to obtain information
about how MySQL executes a statement, or as a synonym for DESCRIBE:

o When you precede a SELECT statement with the keyword EXPLAIN, MySQL
  displays information from the optimizer about the query execution
  plan. That is, MySQL explains how it would process the statement,
  including information about how tables are joined and in which order.
  EXPLAIN EXTENDED can be used to obtain additional information.

  For information about using EXPLAIN and EXPLAIN EXTENDED to obtain
  query execution plan information, see
  https://mariadb.com/kb/en/explain/.

o EXPLAIN PARTITIONS is useful only when examining queries involving
  partitioned tables. For details, see
  http://dev.mysql.com/doc/refman/5.5/en/partitioning-info.html.

o EXPLAIN tbl_name is synonymous with DESCRIBE tbl_name or SHOW COLUMNS
  FROM tbl_name. For information about DESCRIBE and SHOW COLUMNS, see
  [HELP DESCRIBE], and [HELP SHOW COLUMNS].

URL: https://mariadb.com/kb/en/explain/

Например, это взятый из этого примера,

EXPLAIN ANALYZE SELECT *
FROM history AS h1
WHERE EXISTS (
  SELECT 1
  FROM history AS h2
  WHERE h1.lead_id = h2.lead_id
  GROUP BY lead_id
  HAVING count(is_first OR NULL) > 1
);

Выведет что-то подобное на PostgreSQL,

                                                     QUERY PLAN                                                     
--------------------------------------------------------------------------------------------------------------------
 Seq Scan on history h1  (cost=0.00..82680.50 rows=1100 width=9) (actual time=0.048..0.065 rows=3 loops=1)
   Filter: (SubPlan 1)
   Rows Removed by Filter: 3
   SubPlan 1
     ->  GroupAggregate  (cost=0.00..37.57 rows=1 width=5) (actual time=0.007..0.007 rows=0 loops=6)
           Group Key: h2.lead_id
           Filter: (count((h2.is_first OR NULL::boolean)) > 1)
           Rows Removed by Filter: 0
           ->  Seq Scan on history h2  (cost=0.00..37.50 rows=11 width=5) (actual time=0.003..0.004 rows=2 loops=6)
                 Filter: (h1.lead_id = lead_id)
                 Rows Removed by Filter: 4
 Planning time: 0.149 ms
 Execution time: 0.123 ms
(13 rows)

Хотя это эквивалент MySQL,

+------+--------------------+-------+------+---------------+------+---------+------+------+----------+-------------+
| id   | select_type        | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+------+--------------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|    1 | PRIMARY            | h1    | ALL  | NULL          | NULL | NULL    | NULL |    6 |   100.00 | Using where |
|    2 | DEPENDENT SUBQUERY | h2    | ALL  | NULL          | NULL | NULL    | NULL |    6 |   100.00 | Using where |
+------+--------------------+-------+------+---------------+------+---------+------+------+----------+-------------+
2 rows in set, 2 warnings (0.00 sec)

Ответ 4

просто для ясности, комментарий к принятому ответу (не хватает кармы, чтобы добавить комментарий)

procedure analysis() для другой цели - EXPLAIN, он анализирует набор данных указанного столбца и предлагает наилучший тип данных, то есть полезно, когда у нас есть 1000 строк varchar (255) и вы хотите проверить, сколько длины нам действительно нужно, т.е. он мог бы сказать, что varchar (23) будет достаточным

Ответ 5

MySQL 8.0.18 изначально представляет EXPLAIN ANALYZE:

В MySQL 8.0.18 вводится EXPLAIN ANALYZE, который запускает запрос и выводит EXPLAIN вместе со временем и дополнительной информацией на основе итераторов о том, как ожидания оптимизатора соответствуют фактическому выполнению. Для каждого итератора предоставляется следующая информация:

  • Ориентировочная стоимость исполнения

  • Расчетное количество возвращаемых строк

  • Время вернуть первый ряд

  • Время вернуть все строки (фактическая стоимость)

  • Количество строк, возвращаемых итератором

  • Количество петель

    EXPLAIN ANALYZE может использоваться только с инструкциями SELECT.