日期:2014-05-18  浏览次数:20513 次

研究如何最快操作数据insert update delete
前两天在做模拟数据,想模拟10000000条记录。写了个winform程序,记过发现每秒钟最多处理插入300条记录。我记得以前做批量update每秒貌似上千吧。

于是研究下如果想提升到更高,需要怎么做。随便想了个场景。比如大型网游。有无数个玩家在操作。每秒假设有1W条记录产生,然后需要存入数据库。如何做呢。注意,每秒1W不带停的产生。数据每秒都在做insert update delete处理操作。

我用了存储在做insert的时候最多才300条每秒,很郁闷。所以看看大家有啥精辟的方法

------解决方案--------------------
探讨
看不懂楼上的意思噢。
举个例子比如在线的同时1W个玩家击毙了一个怪物。同时1W个玩家的经验值会增加吧。或者服务器刚开服,瞬间10W用户注册进来。

------解决方案--------------------
1:如果模拟数据,不要用winform插入,最好有现成的数据导入,如果没有,在sql里面用语句生成。(lz用存储过程都慢,看来机器性能或是数据库性能有问题)
2:大型网游人物角色的信息基本是存储在文件中的(比如身上物品段数),只有关系信息(比如帮派)存储在战区数据库中(一般mysql).帐户信息存储在主数据库中(mssql,oracle等)

------解决方案--------------------
不要把所有东西压在数据库身上。对于一个大型的应用,缓存方案、分布式方案,高可用性方案,异步操作……都很重要
比如一个大型游戏,他的接入服务器有n台,有各自缓存,只有必须的数据在不同服务器间同步,事实上,同样的数据可能有多份, 要永久保存的东西,才异步操作数据库,当然数据库服务器可能是一个集群。
------解决方案--------------------
数据库只是记录数据而已,但是数据也不一定要实时的存到磁盘上,通常服务器会利用内存来缓存一些数据,成批的存入数据会比单条递交平均存储时间要少的多,所以,应用服务器用内存缓存一些数据+数据库会利用一些缓存+磁盘阵列硬件上的缓存+磁盘阵列是多块盘同时工作,同时分担I/O的,所以楼主的设想的突发状态服务器还是可以应付的
但是,长时间如此负荷就不行了。
------解决方案--------------------
探讨
索引是肯定有的啊。我连日志都简单了。但是说貌似有索引插的就是慢

------解决方案--------------------
高性能服务器
数据缓存,分布式事务
--
具体操作,要开贴一千才能说得清
------解决方案--------------------
wow采用的都是刀片服务器,给你这么比喻下,刀片和你台式机的在数据吞吐方面就像一个能跑400码的跑车对比只能跑30码的电动车
------解决方案--------------------
去跟大型游戏数据库管理员交流交流,啥都明白了
帮顶
------解决方案--------------------
网游的服务器应该是多台数据库服务器联合组成的,并不是一台机器在处理。

还有,插入300的话,我怀疑是不是你机器的IO有问题,正常的笔记本弄个3000条/秒没什么问题的

------解决方案--------------------
探讨
引用:
索引是肯定有的啊。我连日志都简单了。但是说貌似有索引插的就是慢

如果数据是大量的话。有索引肯定比没有索引慢

------解决方案--------------------
这个估计需要对数据库进行分区。以前曾经做过一个实验,就是模拟想数据库中插入100W的数据,结果发现每秒也就是向数据库中插入几百条数据(当然和计算机有关系,也和表的结构,列的数据类型有关系)
------解决方案--------------------
一.加快硬件速度.
二.表分区
三.多线程插入数据
四.利用数据库事务插入数据
...
------解决方案--------------------
public DataSet UpdateByDataSet(DataSet ds, string strTablename)
{
SqlConnection myconn = new SqlConnection(connstr);
SqlCommand sqlcmd = new SqlCommand("select * from " + strTablename, myconn);
SqlDataAdapter myda = new SqlDataAdapter(sqlcmd);
SqlCommandBuilder mycomb = new SqlCommandBuilder(myda);
//myda.DeleteCommand = mycomb.GetDeleteCommand();
myda.InsertCommand = mycomb.GetInsertCommand();
//myda.UpdateCommand = mycomb.GetUpdateCommand();
try
{
lock (this)
{
myconn.Open();
myda.Update(ds, strTablename);
myconn.Close();
return ds;
}
}

catch (Exception ex)
{
myconn.Close();
MessageBox.Show(ex.ToString());
return ds;
}
}
试试,把数据读入dataset,然后一把子插入!我们做过你上面描述的情况的试验,不过你可以试试!