我们有 MySQL 数据库。我们正在尝试使用 C++ 代码中的 ODBC 驱动程序连接到此 MySQL 数据库。我们使用的ODBC驱动是3.51版本。
数据库结构如下: 我们在数据库 D1 中有一个 session 表 CONV_X1,其中包含客户端和服务器机器的 IP 地址以及与此 session 对应的数据,格式如下:
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
我们在另一个数据库 D2 中有另一个表 PROT_NAME,其中包含此协议(protocol) ID 的信息。我们将数据库 D1 中的 CONV_X1 表中的 ProtocolID 映射到数据库 D2 中的 PROT_NAME 表以获取协议(protocol)名称。
从 information_schema 中获取表名 CONV_X1,因为 D1 中可以有多个具有相同名称但 ID 不同的表(例如 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 驱动程序的更改对我们有帮助吗? 我们可以优化查询吗?如果是怎么办?
最佳答案
尝试查看查询计划并确保您拥有适当的索引。
关于c++ - C++中的MySQL运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7333486/