MySQL连接器(libmysql / C)在获取RES时非常慢

时间:2017-08-24 09:47:07

标签: c mysql-connector libmysql

MySQL连接器/ libmysql C中的

"select * from tables"查询获取结果非常慢:

Query process cost

这是我在C代码中的代码:

int getfrommysql() {
    time_t starttime, endtime;
    time(&starttime);
    double st;
    st = GetTickCount();
    MYSQL *sqlconn = NULL;
    MYSQL_RES * res = NULL;
    MYSQL_ROW row = NULL;
    MYSQL_FIELD * field;
    /*char ipaddr[16];
    memset(ipaddr,0,sizeof(ipaddr));*/
    char * sqlquery = "select * from seat_getvalue";
    sqlconn = malloc(sizeof(MYSQL));
    sqlconn = mysql_init(sqlconn);
    mysql_real_connect(sqlconn, "111.111.111.111", "root", "password", "database", 0, NULL, 0);
    char query[100];
    memset(query, 0, 100);
    strcpy(query, "select * from seat_getvalue");
    mysql_query(sqlconn, query);
    res = mysql_store_result(sqlconn);
    int col_num, row_num;
    if (res) {
        col_num = res->field_count;
        row_num = res->row_count;
        printf("\nthere is a %d row,%d field table", res->row_count, res->field_count);
    }
    for (int i = 0; i < row_num; i++) {
        row = mysql_fetch_row(res);
        for (int j = 0; j < col_num; j++) {
            printf("%s\t", row[j]);
        }
        printf("\n");
    }
    mysql_close(sqlconn);
    time(&endtime);
    double et = GetTickCount();
    printf("the process cost time(get by GetTickCount):%f",et-st);
    printf("\nthere is a %d row,%d field table", res->row_count, res->field_count);
}

1 个答案:

答案 0 :(得分:0)

除了事实,你的帖子中甚至没有提出问题,你将苹果与橙子进行比较。 Mysql给你(我认为 - 纠正我,如果我错了)执行查询所需的时间,而在你的C代码中你测量在程序的开始和结束之间经过的时间。这至少有两个原因是错误的:

  1. 两次GetTickCount()次呼叫之间的差异为您提供了整个系统中的呼叫之间的时间,而不是执行软件所花费的时间。这是两个不同的事情,因为你的过程不必从开始到结束不间断地执行 - 它可以(并且可能将)在执行过程中交换另一个进程,它可以被中断等。整个时间系统在程序之外做的事情将被添加到您的测量中。为了花时间执行代码,您可以使用GetProcessTimesQueryProcessCycleTime

  2. 即使你确实使用了一种合适的方法来检索你的时间,你也会计算错误的代码部分。您不必测量执行查询和检索结果所花费的时间,而是测量整个执行时间:建立连接,复制查询,执行查询,存储结果,获取结果,打印结束和关闭连接。这与mysql测量的完全不同。打印数百行可能需要相当多的时间,具体取决于您的shell - 而不是实际的SQL查询执行。如果您想知道连接器需要多长时间来检索数据,您应该对负责执行查询和数据检索的代码进行基准测试。或者,更好的是,使用一些专用的性能监视工具或库。我不能指出具体的解决方案,因为我从未进行过这样的测试,但肯定有一些。