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…


Comments
Nachteil für den Query Cache
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.
kürzer
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’ != ‘’.
Query Cache Nachteil umgehen
$tag = ''; if ( $debug ) { $tag = __FUNCTION__; } $mysqli->query("SELECT * FROM test WHERE '" . $tag . "' != '' AND ...");