写技术类文章出于三个目的,第一,对自己写过的东西做一次总结,温故而知新,第二,希望好友中的大神门对小弟的方法加以改进和建议,第三,对于刚入门的程序员提供有限的建议和方法,人帮我,我帮人!
关于mysql 的插入语句,大家最熟悉不过了, 下面这两句语句实现对mysql数据库的插入
sprintf(query, "insert into useritem (username,name,type,level,amount) values ( '%s','%s','%s','%s',1);",Tusername,BuyName,type,level);
mysql_query(&_mysql, query);
但大家有没有想过如果同时上千条,上万条,甚至插入百万条记录,这时就不的不考虑一个效率问题了,
普通处理方法:用for()循环插入
for(int i=0;i<1000;i++)
{
sprintf(query, "insert into useritem (username,name,type,level,amount) values ( '%s','%s','%s','%s',1);",Tusername,BuyName,type,level);
mysql_query(&_mysql, query);
}
上述方法当然能够实现需求,但是效率不行,大约插入1000条几率所用时间为7S
那有没有方法提高效率?ps:这句话好SB,如果没有,我还写个虾球哦!呵呵~~~~~
MySQL默认的数据提交操作模式是自动提交模式(autocommit)。这就表示每个查询都被当做一个单独的事务自动执行。我们可以通过设置autocommit的值改变是否是自动提交autocommit模式
MySQL默认的存储引擎是MyISAM,MyISAM存储引擎不支持事务处理,所以改变autocommit没有什么作用,InnoDB存储引擎支持事务处理。InnoDB表引擎下关闭mysql自动事物提交可以大大提高数据插入的效率,这是因为如果需要插入1000条数据,mysql会自动发起(提交)1000次的数据写入请求,如果把autocommit关闭掉,通过程序来控制,只要一次commit就可以搞定:
bool ConnectDatabase() //连接数据库
{
//初始化mysql
mysql_init(&_mysql); //连接mysql,数据库
int ret;
ret = mysql_options(&_mysql, MYSQL_SET_CHARSET_NAME, "gb2312");
if(ret ==0 )
{
printf("options success\n");
}
if( ! mysql_real_connect(&_mysql,host_name,user_name,password,db_name,0,NULL,0))
{
printf( "Error connecting to database:%s\n",mysql_error(&_mysql));
return false;
}
else
{
printf("Connected...\n");
mysql_autocommit(&_mysql, 0); //关闭自动提交
return true;
}
}
sprintf(query, "insert into useritem (username,name,type,level,amount) values ( '%s','%s','%s','%s',1);",Tusername,BuyName,type,level);
for( i = 0;i<1000i++)
{
mysql_query(&_mysql, query);
if(i == 999)
{
mysql_commit(&_mysql);//提交
}
}
红色代码段就是实现快速插入的代码,这样经过测试 插入1000纪录大约所花时间 2.4S,随着插入数量越多,优势就体现的更明显