做毕设过程中使用了c++对mysql进行操作的一些API,本质是一个c的库。
遇到了一个小问题,就是对于多行数据的存取效率。
(1)我的代码中主要是利用mysql_query()函数与数据库进行交互,而在实际操作中,每一条mysql_query()语句对于数据库来说不仅仅是一条命令的执行,更是一个事务的提交。
所以对于需要循环插入大量数据的情况,频繁的事务创建和销毁会浪费很多时间,解决办法:
mysql_query(mysql,"START TRANSACTION");//开启事务,提高传输效率
while(getline(my_file,data_temp)){
sql = "";//构造sql语句
if(mysql_query(mysql,sql.c_str())){
cout<<"第"<<data_num<<"条数据入库失败:"<<mysql_error(mysql)<<endl;
cout<<"出错的sql语句为:"<<sql<<endl;
}
}
if(mysql_query(mysql,"COMMIT")){//提交事务
cout<<"临时数据入库失败!"<<mysql_error(mysql)<<endl;
cout<<"出错的sql语句为:"<<sql<<endl;
}
将整个数据循环插入的过程封装为一个事务(mysql默认一次query一个事务,此处为自己声明的事务)。
(2)另外,我用的c++语言,mysql_query()参数需要用char* 类型,所以通过c_str()函数进行转换。
这里就涉及到了另一个问题,即构造所需的sql string的效率问题,经过测试,对一些固定的字符串转化为变量,构造字符串的开销可以节省近乎一半的时间(测试了十万条数据)。
简单来说就是:
string str1 = "hello";
string str2 = "world";
string str3 = " ";
string str4;
for(int i=0;i<100000;++i){
str4 = str1+str3+str2;
}
声明一些变量来存放需要多次重复使用的字符串,而不要像下面一样直接加字符串常量。
str4 = "hello" + str3 + "world";
这一点对于需要大量构造的字符串来说具有一定意义,当然c++的高效使得这种体验感差异很小。