Explain до его реального запроса

46 views
Skip to first unread message

Naim Sh.

unread,
Mar 26, 2018, 4:34:54 AM3/26/18
to moscow-mysq...@googlegroups.com
Всем привет.


Сталкиваюсь часто с проблемой , что сторонние разрабы подготовливают
зачастую не очень хорошие sql запросы SELECT .
Некоторые для проверки и
оптимизации их(отсылаю им графический EXPLAIN [спасибо mysql workbench
] ) требует для своего EXPLAIN очень много времени , а без него не знаю
структуру таблицы мне сложно им советовать .

Существует ли способ, хотя
бы приблизительно получать результаты по смыслу такие же как и EXPLAIN
без исполнение запроса? Есть ли аналог линта для них ?

СУБД Percona или
последние mariadb

Sveta Smirnova

unread,
Mar 26, 2018, 8:28:28 AM3/26/18
to moscow-mysq...@googlegroups.com, Naim Sh., sveta.s...@gmail.com
Привет!
EXPLAIN не выполняет запрос, если только в нём нет подзапросов в FROM
clause. Сравните время выполнения:

mysql> explain select 1, sleep(10) from dual;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  |
key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL |
NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.01 sec)

mysql> explain select 1 from (select sleep(5) from dual) d;
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table      | partitions | type   | possible_keys |
key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
|  1 | PRIMARY     | <derived2> | NULL       | system | NULL          |
NULL | NULL    | NULL |    1 |   100.00 | NULL           |
|  2 | DERIVED     | NULL       | NULL       | NULL   | NULL          |
NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
2 rows in set, 1 warning (5.01 sec)

То есть вам нужно все эти медленные подзапросы убрать из запроса и
посмотреть без них. Хотя план может сильно измениться, конечно.

С уважением,
Света Смирнова.

Naim Sh.

unread,
Mar 26, 2018, 9:39:09 AM3/26/18
to Sveta Smirnova, moscow-mysq...@googlegroups.com, sveta.s...@gmail.com
А где в коде поковырять{ да этот случай на самый крайний случай :_)
} чтобы посмотреть как будет делать оптимизатор .
Просто хочуться сервис запилить ( что-то типа greensql ) , чтобы
совсем криво*опые запросы не пропускало )
> +----+-------------+------------+------------+--------+------------

Sveta Smirnova

unread,
Mar 26, 2018, 9:50:35 AM3/26/18
to moscow-mysq...@googlegroups.com, Naim Sh., sveta.s...@gmail.com
В коде ковырять необязательно, можно посмотреть
INFORMATION_SCHEMA.OPTIMIZER_TRACE. Это вывод в  формате JSON того, что
делает оптимизатор.

Чтобы запросы не пропускать в версии 5.7 можете либо сами написать Query
Rewrite Audit plugin, либо даже использовать готовый Query Rewriter
plugin (есть только в Percona и MySQL Servers). Также можно при помощи
Query Rewrite функциональности ProxySQL сделать тоже самое.


On 26-03-2018 16:39, Naim Sh. wrote:
> А где в коде поковырять{ да этот случай на самый крайний случай :_)
> } чтобы посмотреть как будет делать оптимизатор .
> Просто хочуться сервис запилить ( что-то типа greensql ) , чтобы
> совсем криво*опые запросы не пропускало )
>
> On Mon, 2018-03-26 at 15:28 +0300, Sveta Smirnova wrote:
>> +----+-------------+------------+------------+--------+------------
Reply all
Reply to author
Forward
0 new messages