Frage Wie sehe ich hochpräzise Abfragezeiten in der mysql-Befehlszeile?


Ich arbeite durch einige Optimierungsarbeiten, und mir ist aufgefallen, dass in einigen mysql-Dumps, die Leute in Artikeln und Fragen posten (die ich jetzt nicht mehr finde), hochpräzise Ausführungszeiten (0.05985215 sec statt 0,06 Sekunden).

Wie kann ich diese präziseren Zeiten für meine Abfragen in der Befehlszeile sehen?

BEARBEITEN

Beispiel dafür ist:

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

Die Verwendung von Profiling bringt mich teilweise dorthin, erzeugt aber eine zu lange Ausgabe, und ich muss daran denken, sie zu aktivieren. Ich suche nur eine einfache hochpräzise Dauer.

SET profiling = 1;
<query>
SHOW PROFILES;

Gibt mir so etwas:

+----------------------+-----------+
| 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)

16
2018-05-23 20:37


Ursprung


Antworten:


Es scheint, dass die beste Antwort darauf ist, Profiling zu ermöglichen. Es hat keine anderen Hinweise gegeben, die herauskommen.

Beste Antwort, verwenden Sie Abfrage Profiling.

SET profiling = 1;
<query>
SHOW PROFILES;

12
2018-06-02 18:26



Diese Frage beantwortet man am besten mit dem Blick auf die Quelle des mysql-Befehlszeilenclients. das relevantes Stück Code,

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);
}

hat die Anzahl der Nachkommastellen für die sek Wert hart codiert in (2). das würde mich zu dem Schluss bringen, dass höhere Präzisionszeiten sind nicht möglich mit einem Lager mysql installieren.

Natürlich könnten Sie diesen Code patchen, ihn konfigurierbar machen, usw. von der Quelle installieren. ich denke, das ist was die Leute in der Artikel und Fragen Sie erwähnten, tun. Ihre beste Chance herauszufinden, ist, sie einfach zu fragen (siehe meinen Kommentar zu Ihrer Frage).


10
2018-05-25 14:35



Ohne die Dumps zu sehen, von denen Sie sprechen, ist es wahrscheinlich eine benutzerdefinierte Funktion? Sieh diesen Thread ( http://lists.mysql.com/internals/33707 ) für ein paar Fallstricke und wie es geht.


0
2018-05-24 15:59



Nicht elegant, aber funktionierende Lösung ist Patch /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 

Es funktioniert, weil CURRENTLY nur eine Formatzeichenfolge '% .2f sec' in der mysql-Binärdatei hat, ABER es kann sich im Laufe der Zeit ändern. Sie können zu der ursprünglichen Binärdatei zurückkehren, indem Sie umgekehrten Patch anwenden:

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

0
2018-06-17 04:08