Статьи

Как объяснить ваши запросы SQL EXPLAIN

Крутые ребята, возможно, перешли на NoSQL, но для многих из нас реляционные базы данных остаются важной частью повседневной веб-разработки. Я также готов поспорить, что реляционные базы данных будут еще через десять лет. Несмотря на наше знакомство, синтаксис SQL является мрачным искусством. Единственный человек, который понимает SQL, — тот странный парень с бородой и сандалиями, который бормочет себе в углу вашего офиса. Все остальные используют силу и проводят много разочарованных часов, бесцельно глядя на сломанные запросы SELECT.

MySQL и MariaDB предоставляют полезную команду EXPLAIN которая может анализировать ваши запросы и выявлять потенциальные проблемы с производительностью:

  • EXPLAIN описывает, как будет обрабатываться SELECT , включая информацию о JOINS .
  • EXPLAIN EXTENDED предоставляет дополнительную информацию и оценивает количество строк таблицы, отфильтрованных по условию.

Команда просто добавляется в начало вашего запроса, например

 EXPLAIN SELECT * FROM `user`; 

Выходной результат:

 +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 4 | | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ 

Хм — что это все значит?

К счастью, эти хорошие люди в MariaDB предоставили полезный анализатор, чтобы объяснить ваши ОБЪЯСНЕНИЯ:
https://mariadb.org/explain_analyzer/

Вы можете вставить полученную таблицу в поле Отправить новое объяснение и нажать кнопку « Анализ»

SQL EXPLAIN Analyzer

Нажмите на любой жирный подчеркнутый текст для получения дополнительной информации о результате EXPLAIN .

Извлечение EXPLAIN таблиц

К сожалению, извлечение таблицы EXPLAIN может быть немного сложнее. Если вы используете интерфейс командной строки mysql>, результат можно обернуть:

 +----+-------------+-------+------+---------------+------+---------+------+----- -+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+----- -+-------------+ | 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 4 | Using where | +----+-------------+-------+------+---------------+------+---------+------+----- -+-------------+ 

Копирование непосредственно из консоли в Анализатор не будет работать, если вы сначала не удалите необходимые разрывы строк. Вы можете увеличить ширину окна консоли, но нет гарантии, что все результаты подойдут.

Лучшая альтернатива — вывести результат в текстовый файл и скопировать оттуда таблицу EXPLAIN . Если вы используете командную строку MySQL, команда tee перенаправит весь вывод консоли в именованный файл, например

 mysql> tee out.txt 

(Обратите внимание, что пути к файлам должны использовать косую черту ‘/’ даже в Windows.)

Кроме того, вы можете использовать параметр командной строки \ T при запуске mysql:

 > mysql \T "out.txt" 

Или, если вы чувствуете себя особенно смелым, вы можете направить весь вывод EXPLAIN в файл с помощью одной команды:

 > mysql -u [dbuser] -p[dbpass] -e "[query]" > out.txt 

где:

  • [dbuser] — имя пользователя базы данных
  • [dbpass] — пароль пользователя базы данных (между ключом -p и паролем нет пробела)
  • [query] является оператором SQL, например, USE mydatabase; EXPLAIN SELECT * FROM mytable; USE mydatabase; EXPLAIN SELECT * FROM mytable;

В этом случае путь к выходному имени файла должен соответствовать стандарту вашей ОС, то есть «\» в Windows и «/» в Mac или Linux.

Explain Analyzer — отличный инструмент, который объясняет EXPLAIN на простом английском языке. Вскоре вы станете гуру SQL в вашей команде … начните отращивать бороду.