Как просмотреть высокоточные запросы в командной строке mysql?

Я работаю над некоторой работой по оптимизации, и я заметил, что в некоторых дампах mysql люди публикуют в статьях и вопросах (которые я не могу найти снова сейчас, что я действительно ищу), есть времена высокой точности выполнения (0,05985215 с вместо 0,06 с).

Как я могу увидеть эти более точные времена для моих запросов в командной строке?

ИЗМЕНИТЬ

Пример:

+----------+
| COUNT(*) |
+----------+
| 11596    |
+----------+
1 row in set (0.05894344 sec)

Использование профилирования делает меня частью этого пути, но слишком длинный вывод, и я должен помнить, чтобы включить его. Я просто ищу простую высокую точность.

SET profiling = 1;
<query>
SHOW PROFILES;

Дает мне что-то вроде этого:

+----------------------+-----------+
| Status               | Duration  |
+----------------------+-----------+
| (initialization)     | 0.000005  |
| checking permissions | 0.00001   |
| Opening tables       | 0.000499  |
| Table lock           | 0.000071  |
| preparing            | 0.000018  |
| Creating tmp table   | 0.00002   |
| executing            | 0.000006  |
| Copying to tmp table | 6.565327  |
| Sorting result       | 0.000431  |
| Sending data         | 0.006204  |
| query end            | 0.000007  |
| freeing items        | 0.000028  |
| closing tables       | 0.000015  |
| logging slow query   | 0.000005  |
+----------------------+-----------+
14 rows in set (0.00 sec)

Ответы

Ответ 1

Кажется, что лучший ответ на это - включить профилирование. Не было никаких других решений, которые выходят за рамки.

Лучший ответ, используйте профилирование запросов.

SET profiling = 1;
<query>
SHOW PROFILES;

Ответ 2

на этот вопрос лучше всего ответить, посмотрев источник клиента командной строки mysql. соответствующий фрагмент кода,

static void nice_time(double sec,char *buff,bool part_second)
{
  // ...
  if (part_second)
    sprintf(buff,"%.2f sec",sec);
  else
    sprintf(buff,"%d sec",(int) sec);
}

имеет число цифр после десятичной точки для значения sec, жестко закодированного в (2). это заставит меня прийти к выводу, что более высокие времена точности невозможны при установке базы данных mysql.

конечно, вы можете исправить этот код, настроить его и т.д. и установить из источника. я думаю, это то, что делают люди в статьях и вопросах, о которых вы говорили. ваш лучший шанс узнать, просто спросить их (см. мой комментарий к вашему вопросу).

Ответ 3

Не видя дампов, о которых вы говорите, возможно, это определенная пользователем функция? См. Эту тему (http://lists.mysql.com/internals/33707) для пары исправлений и как это сделать.

Ответ 4

Не изящно, но рабочим решением является патч /usr/bin/mysql:

# copy the original mysql binary to your home dir
cp /usr/bin/mysql ~/mysql
# patch it
sed -i -e 's/%.2f sec/%.8f sec/1' ~/mysql 
# run it from the home directory
~/mysql 

Это работает, потому что в бинарнике mysql существует только одна строка формата "%.2f sec", но она может меняться со временем. Вы можете вернуться к исходному двоичному файлу, применив обратный патч:

sed -i -e 's/%.8f sec/%.2f sec/1' ~/mysql