MySQL 8.0 C API Developer Guide
MYSQL_RES * mysql_use_result(MYSQL *mysql)
          After invoking
          mysql_real_query() or
          mysql_query(), you must call
          mysql_store_result() or
          mysql_use_result() for every
          statement that successfully produces a result set
          (SELECT,
          SHOW,
          DESCRIBE,
          EXPLAIN,
          CHECK TABLE, and so forth). You
          must also call
          mysql_free_result() after you
          are done with the result set.
        
          mysql_use_result() initiates a
          result set retrieval but does not actually read the result set
          into the client like
          mysql_store_result() does.
          Instead, each row must be retrieved individually by making
          calls to mysql_fetch_row().
          This reads the result of a query directly from the server
          without storing it in a temporary table or local buffer, which
          is somewhat faster and uses much less memory than
          mysql_store_result(). The
          client allocates memory only for the current row and a
          communication buffer that may grow up to
          max_allowed_packet bytes.
        
          On the other hand, you should not use
          mysql_use_result() for locking
          reads if you are doing a lot of processing for each row on the
          client side, or if the output is sent to a screen on which the
          user may type a ^S (stop scroll). This ties
          up the server and prevent other threads from updating any
          tables from which the data is being fetched.
        
          When using mysql_use_result(),
          you must execute
          mysql_fetch_row() until a
          NULL value is returned, otherwise, the
          unfetched rows are returned as part of the result set for your
          next query. The C API gives the error Commands out of
          sync; you can't run this command now if you forget
          to do this!
        
          You may not use
          mysql_data_seek(),
          mysql_row_seek(),
          mysql_row_tell(),
          mysql_num_rows(), or
          mysql_affected_rows() with a
          result returned from
          mysql_use_result(), nor may
          you issue other queries until
          mysql_use_result() has
          finished. (However, after you have fetched all the rows,
          mysql_num_rows() accurately
          returns the number of rows fetched.)
        
          You must call
          mysql_free_result() once you
          are done with the result set.
        
          mysql_use_result() resets
          mysql_error() and
          mysql_errno() if it succeeds.
        
Commands were executed in an improper order.
Out of memory.
The MySQL server has gone away.
The connection to the server was lost during the query.
An unknown error occurred.