【问题标题】:MySQL connector(libmysql/C) is very slow in get RESMySQL 连接器(libmysql/C)在获取 RES 时非常慢
【发布时间】:2017-08-24 09:47:07
【问题描述】:

"select * from tables" MySQL 连接器/libmysql C 中查询结果很慢:

这是我的 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);
}

【问题讨论】:

    标签: c mysql-connector libmysql


    【解决方案1】:

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

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

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

    【讨论】:

    • 那个!打印线的成本太高了……查询和执行时间大约是 60 毫秒,这是对的……也许我问了一个愚蠢的问题……ttttt非常感谢..
    猜你喜欢
    • 2012-01-03
    • 2012-01-29
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多