La table des statistiques client a une colonne "Queries vides". Qu'est-ce que ça veut dire? Simple Google me dit simplement que le nombre de fois que les connexions de ce client ont envoyé des requêtes vides au serveur. "/Facepalm
Malheureusement, cela n'est pas documenté dans le manuel MySQL - la page serait celle-ci . Je ne connaissais pas la réponse, mais j'ai réussi à le déboger de la source 5.5:
Il s'agit de requêtes sur le serveur qui ne produisent pas de requêtes SQL. c'est à dire.
laptop1113-2:~ morgant$ mysql -e "SHOW GLOBAL status like 'Com_empty_query';"
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Com_empty_query | 2 |
+-----------------+-------+
laptop1113-2:~ morgant$ mysql --comments -e '-- sql comment'
laptop1113-2:~ morgant$ mysql -e "SHOW GLOBAL status like 'com_empty_query';"
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Com_empty_query | 3 |
+-----------------+-------+
(Vous devez ajouter --Comments, car l'utilitaire de ligne de commande par défaut les dépouillera.)
Comment déboguer quelque chose comme ça dans MySQL:
Les commandes de Variables COM_ signifient - ceci est un indice qu'il s'agit d'une sorte de déclaration. Le code qui génère le statut global d'affichage est de ./sql/mysqld.cc (vous auriez pu trouver ceci si vous ne saviez pas en grepping pour la requête et vide sur la même ligne). À ~ Ligne 3025:
{"drop_view", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_VIEW]), SHOW_LONG_STATUS},
{"empty_query", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_EMPTY_QUERY]), SHOW_LONG_STATUS},
{"execute_sql", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_EXECUTE]), SHOW_LONG_STATUS},
Cela nous dit donc que le statut global montre simplement la valeur de SQLCom_empty_Query. Nous pouvons alors grep pour cette chaîne:
laptop1113-2:5.5 morgant$ grep -riF 'SQLCOM_EMPTY_QUERY' .
./mysql-test/r/implicit_commit.result:# SQLCOM_EMPTY_QUERY
./mysql-test/t/implicit_commit.test:--echo # SQLCOM_EMPTY_QUERY
./sql/mysqld.cc: {"empty_query", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_EMPTY_QUERY]), SHOW_LONG_STATUS},
./sql/sql_Lex.h: SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
./sql/sql_parse.cc: case SQLCOM_EMPTY_QUERY:
./sql/sql_yacc.yy: thd->Lex->sql_command= SQLCOM_EMPTY_QUERY;
Ignorer les tests et le fichier que nous venons de regarder. Les seuls autres fichiers mentionnés ici sont ceux qui concernent l'analyseur ( YACC ). Si nous ouvrons SQL_PARSE.CC, nous venons de voir un retour sans intérêt:
case SQLCOM_EMPTY_QUERY:
my_ok(thd);
break;
Si nous ouvrons SQL_YACC.YY, nous pouvons voir que cela concerne en quelque sorte être à la fin_of_input et aucune requête n'a été trouvée:
query:
END_OF_INPUT
{
THD *thd= YYTHD;
if (!thd->bootstrap &&
(!(thd->Lex->select_Lex.options & OPTION_FOUND_COMMENT)))
{
my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY), MYF(0));
MYSQL_YYABORT;
}
thd->Lex->sql_command= SQLCOM_EMPTY_QUERY;
YYLIP->found_semicolon= NULL;
}
| verb_clause
D'ici, je suppose à peu près. Tout est traité à l'analyseur et ne pénètre jamais d'autres composants de MySQLD.