MySQL коннектор (libmysql/C) очень медленно получает RES

"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);
}

1 ответ

Решение

Помимо того, что в вашем посте даже не задан вопрос, вы сравниваете яблоки с апельсинами. Mysql дает вам (я думаю - поправьте меня, если я ошибаюсь) время, необходимое для выполнения запроса, в то время как в вашем C-коде вы измеряете время, которое прошло между началом и концом программы. Это неправильно по крайней мере по двум причинам:

  1. Разница между двумя вызовами GetTickCount() дает вам время, прошедшее между вызовами во всей системе, а не время, потраченное на выполнение вашего программного обеспечения. Это две разные вещи, потому что ваш процесс не должен выполняться непрерывно от начала до конца - он может (и, вероятно, будет) заменен другим процессом в середине выполнения, он может быть прерван и т. Д. Все время система, потраченная на работу вне вашей программы, будет добавлена ​​к вашим измерениям. Чтобы получить время, потраченное на выполнение вашего кода, вы, вероятно, можете использовать GetProcessTimes или QueryProcessCycleTime.

  2. Даже если вы использовали соответствующий метод получения своего времени, вы синхронизируете неправильную часть кода. Вместо того, чтобы измерять время, потраченное только на выполнение запроса и получение результатов, вы измеряете все время выполнения: установление соединения, копирование запроса, его выполнение, сохранение результатов, выборку их, печать их и закрытие соединения. Это сильно отличается от того, что измеряет mysql. А печать сотен строк может занять довольно много времени, в зависимости от вашей оболочки - больше, чем фактическое выполнение SQL-запроса. Если вы хотите узнать, сколько времени требуется соединителю для извлечения данных, вам следует сравнить только тот код, который отвечает за выполнение запроса и извлечение данных. Или, что еще лучше, используйте специальные инструменты или библиотеки для мониторинга производительности. Я не могу указать конкретное решение, потому что я никогда не проводил подобные тесты, но, безусловно, они должны быть.

Другие вопросы по тегам