MySQL в C ++ работает медленно - PullRequest
1 голос
/ 07 сентября 2011

У нас есть база данных MySQL. Мы пытаемся подключиться к этой базе данных MySQL с помощью драйверов ODBC в коде C ++. Используемые нами драйверы ODBC версии 3.51.

Структура базы данных выглядит следующим образом: У нас есть таблица диалога CONV_X1 в базе данных D1, которая содержит IP-адрес клиентских и серверных машин и данные, соответствующие этому диалогу, в следующем формате:

ProtocolID ServerID ClientID TimeStamp InOctets OutOctets

     24  167772161  167772162  1310121900         0  1.741e+006 
    632  167772161  167772162  1310121900         0  1.741e+006 
     24  167772161  167772162  1310122800         0    1.8e+006 

У нас есть другая таблица PROT_NAME в другой базе данных D2, которая содержит информацию для этого идентификатора протокола. Мы сопоставляем ProtocolID из таблицы CONV_X1 в базе данных D1 с таблицей PROT_NAME в базе данных D2, чтобы получить имя протокола.

Из information_schema взято имя таблицы CONV_X1, так как в D1 может быть несколько таблиц с одним и тем же именем с разными идентификаторами (пример. CONV_X1, CONV_X2 и т. Д.)

Мы извлекаем данные из этой базы данных в формате

ServerID:ClientID_ProtocolName_InOctets_tableName
ClientID:ServerID_ProtocolName_InOctets_tableName 

Итак, для отметки времени 1310121900 данные, которыми мы манипулируем, имеют следующий формат

10.0.0.1:10.0.0.2_ftp_InOctets_CONV_X1 data is 0
10.0.0.2:10.0.0.1_ftp_InOctets_CONV_X1 data is 1.741e+006

10.0.0.1:10.0.0.2_udp_InOctets_CONV_X1 data is 0
10.0.0.2:10.0.0.1_udp_InOctets_CONV_X1 data is 1.741e+006

Мы используем следующий запрос для достижения результата

select distinct concat(inet_ntoa(np.serverid), ':',inet_ntoa(np.clientid),'_inoctets_',rp.name,'_',c.table_name)HostCounter1, concat(inet_ntoa(np.clientid),':',inet_ntoa(np.serverid),'_inoctets_',rp.name,'_',c.table_name)HostCounter2, np.inoctets value1 ,np.outoctets value2, from_unixtime(timestamp) from information_schema.`COLUMNS` c,D1.CONV_X1 np,D2.PROT_NAME rp where c.table_schema='D1' AND c.table_name ='CONV_X1' AND np.protocolid=rp.id AND np.timestamp between unix_timestamp('2011-08-31 10:33:14') AND unix_timestamp('2011-08-31 11:33:14') order by timestamp;

Это даст вывод в следующем формате:

HostCounter1 HostCounter2 value1 value2 from_unixtime(timestamp)
10.0.0.1:10.0.0.2_ftp_InOctets_CONV_X1 10.0.0.2:10.0.0.1_ftp_InOctets_CONV_X1 0 1.741e+006 1310121900(in unix format)
10.0.0.1:10.0.0.2_udp_InOctets_CONV_X1 10.0.0.2:10.0.0.1_udp_InOctets_CONV_X1 0 1.741e+006

Наш код C ++ выполняет это с помощью вызовов SQL SQLDriverConnect (), SQLExecDirect (), эти вызовы занимают много времени для подключения к базе данных и выполнения этого запроса. Из-за этого мы сталкиваемся с проблемой производительности нашего кода C ++. Пожалуйста, дайте нам знать, есть ли способ решить проблему с производительностью. Поможет ли нам изменение драйвера ODBC? Можем ли мы оптимизировать запрос? Если так, то как?

1 Ответ

0 голосов
/ 08 сентября 2011

Попробуйте посмотреть план запроса и убедитесь, что у вас есть соответствующие индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...