web-dev-qa-db-fra.com

Qu'est-ce qu'une "requête vide" dans informations_schema.client_statistics?

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

2
atxdba

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.

5
Morgan Tocker