You are here

MySQL Queries taggen

Früher, lange, lange ist's her, konnte man den folgenden Trick verwenden um MySQL Queries in der Applikation zu taggen:

SELECT /* My Application Tag */ * FROM test;

Im Slow Query Log und im General Query Log ist das SQL Query dann wie folgt erschienen:

# Time: 111020 22:03:33
# User@Host: root[root] @ localhost []  Id:  1335
# Query_time: 17.873938  Lock_time: 0.007952 Rows_sent: 12048576  Rows_examined: 12048576
use test;
SET timestamp=1319141013;
SELECT /* My Application Tag */ * FROM test;

und

111020 22:03:15  1335 Query     SELECT /* My Application Tag */ * FROM test

Das ist recht nützlich, wenn man nicht genau weiss woher ein Query stammt oder wie es von der Applikation schlussendlich ausformuliert wird.

Leider wurde dieses Feature irgendwann einmal von MySQL abgeschafft. Wann das genau geschehen ist, konnte ich nicht mehr herausfinden. Heute sehen die entsprechenden Einträge wie folgt aus:

# Time: 111020 22:03:33
# User@Host: root[root] @ localhost []  Id:  1335
# Query_time: 17.873938  Lock_time: 0.007952 Rows_sent: 12048576  Rows_examined: 12048576
use test;
SET timestamp=1319141013;
SELECT  * FROM test;

und

111020 22:03:15  1335 Query     SELECT  * FROM test

Bei unserem heutigen Kunden hatten wir wieder mal genau dieses Problem. Zum Glück hatte er eine glorreiche Idee. Aus:

SELECT * FROM test WHERE 1 = 1;

machten wir kurzerhand:

SELECT * FROM test WHERE 'My Application Tag' = 'My Application Tag';

und siehe da:

# Time: 111020 22:24:59
# User@Host: root[root] @ localhost []  Id:  2077
# Query_time: 12.270074  Lock_time: 0.000124 Rows_sent: 12048576  Rows_examined: 12048576
use test;
SET timestamp=1319142299;
SELECT * FROM test WHERE 'My Application Tag' = 'My Application Tag';

und

2077 Query     SELECT * FROM test WHERE 'My Application Tag' = 'My Application Tag'

es funktioniert...

Ist zwar nicht ganz so sexy, aber recht nützlich...

Taxonomy upgrade extras: 

Comments

Gute Lösung für das Taggen, keine so gute Lösung für den Query Cache, wenn die gleiche Query von mehreren Applikationen benutzt wird. Die Lösung mit dem MySQL-Kommentar war da besser, weil der MySQL-Kommentar nicht Querycacherelevant war, dieser Workaround aber schon. Einfache Rechnung: mit Kommentar: 1 Query, 7 Applikationen nutzen ihn = ein Eintrag im Query Cache diese Variante: 1 Query, 7 Applikationen nutzen ihn = sieben Einträge im Query Cache.
Mirkocomment

$tag = '';
if ( $debug ) {
  $tag = __FUNCTION__;
}

$mysqli->query("SELECT * FROM test WHERE '" . $tag . "' != '' AND ...");
olicomment

Es würde auch mit SELECT * FROM test WHERE '1 My Application Tag' gehen, das ist nämlich wegen der vorgestellten 1 (allgemein ginge jede Zahl betragsmäßig größer 0,5) 'wahr' und ist kürzer. Oder 'My Application Tag' != ''.
Ralfcomment