用.net连接MySql后,两种驱动均使用(odbc和for .net)可是大量插入数据时速度非常之慢,和同等条件下的Access来比慢了将近5倍,这是为什么,起初我以为是odbc接口的问题,可是我把 Access的接口由oledb改为odbc测试一下仍然比MySql要快5倍!!!!
其实我所要插入的数据量并不大,几千条而已,可是为什么速度竟然到达分钟级别?那位大哥可以帮忙解释????急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!
插入方法我也用了两种比较1.循环插入2;update插入,可是并没有什么改观什么原因???
以下是我其中一种别插入方法的代码:
private void DataBaseInsert()
{
System.Data.Odbc.OdbcConnection cn =new System.Data.Odbc.OdbcConnection(this.strCnOdbc);string strSql ="insert into test.sima values (?,?,?,?)";
System.Data.Odbc.OdbcCommand cmd = new System.Data.Odbc.OdbcCommand(strSql,cn);
System.Data.Odbc.OdbcParameterCollection pc = cmd.Parameters;
pc.Add("id",System.Data.Odbc.OdbcType.Int,4);
pc.Add("ox",System.Data.Odbc.OdbcType.Double,8);
pc.Add("oy",System.Data.Odbc.OdbcType.Double,8);
pc.Add("name",System.Data.Odbc.OdbcType.Char,8);
int count = this.al.Count;
this.progressBar1.Maximum=count;
cn.Open();
for(int i=0;i<count;i++)
{
string name ="";
double ox=0,oy=0;
Form1.splitString(ref name,ref ox,ref oy,this.al[i].ToString());cmd.Parameters["id"].Value=i;
cmd.Parameters["ox"].Value=ox;
cmd.Parameters["oy"].Value=oy;
cmd.Parameters["name"].Value="name";
this.progressBar1.Value=i+1;
cmd.ExecuteNonQuery();
}
}
另外我还用postgresql尝试了一下速度也超慢,是不是.net控制数据库除了微软自己的(Access、SQL)
以外都特别慢呀????哪位同仁能上来解释一下多谢了
其实我所要插入的数据量并不大,几千条而已,可是为什么速度竟然到达分钟级别?那位大哥可以帮忙解释????急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!
插入方法我也用了两种比较1.循环插入2;update插入,可是并没有什么改观什么原因???
以下是我其中一种别插入方法的代码:
private void DataBaseInsert()
{
System.Data.Odbc.OdbcConnection cn =new System.Data.Odbc.OdbcConnection(this.strCnOdbc);string strSql ="insert into test.sima values (?,?,?,?)";
System.Data.Odbc.OdbcCommand cmd = new System.Data.Odbc.OdbcCommand(strSql,cn);
System.Data.Odbc.OdbcParameterCollection pc = cmd.Parameters;
pc.Add("id",System.Data.Odbc.OdbcType.Int,4);
pc.Add("ox",System.Data.Odbc.OdbcType.Double,8);
pc.Add("oy",System.Data.Odbc.OdbcType.Double,8);
pc.Add("name",System.Data.Odbc.OdbcType.Char,8);
int count = this.al.Count;
this.progressBar1.Maximum=count;
cn.Open();
for(int i=0;i<count;i++)
{
string name ="";
double ox=0,oy=0;
Form1.splitString(ref name,ref ox,ref oy,this.al[i].ToString());cmd.Parameters["id"].Value=i;
cmd.Parameters["ox"].Value=ox;
cmd.Parameters["oy"].Value=oy;
cmd.Parameters["name"].Value="name";
this.progressBar1.Value=i+1;
cmd.ExecuteNonQuery();
}
}
另外我还用postgresql尝试了一下速度也超慢,是不是.net控制数据库除了微软自己的(Access、SQL)
以外都特别慢呀????哪位同仁能上来解释一下多谢了
速度应该会有所提高
StringBuilder sb = new StringBuilder();
for(int i=0;i<count;i++)
{
sb.append(YourSql);
}
.....
cmd.CommandText=sb.ToString();
.....
到底速度慢的原因是什么,哪位仁兄帮忙解释一下
IO操作过于频繁
在循环中操作数据库是一忌
应该尽量少地访问数据库
前面的方法,只需要跟数据库进行一次交互
这是最快的了。
ACCESS是文件型数据库,跟SQL SERVE、MYSQL有本质区别的
ACCESS在数据量小、访问用户少的情况下,是比它们快,但是数量一大就不行了
你插入几千条资料花1分钟,不算什么的,很正常
string strSql ="select * from test.sima";
string insertSql ="insert into test.sima values (@id,@ox,@oy,@name)";
System.Data.DataSet ds = new DataSet();
CoreLab.MySql.MySqlParameter parm;
//CoreLab.PostgreSql.PgSqlConnection cn = new PgSqlConnection(this.strCn);
CoreLab.MySql.MySqlDataAdapter adapter = new CoreLab.MySql.MySqlDataAdapter(strSql,this.strCn);
adapter.Fill(ds,"sima");
int count = this.al.Count;
this.progressBar1.Maximum=count;
//ds.Tables[0].RowChanged+=new DataRowChangeEventHandler(Row_Changed);
for(int i=0;i<count;i++)
{
string name ="";
double ox=0,oy=0;
Form1.splitString(ref name,ref ox,ref oy,this.al[i].ToString());
adapter.InsertCommand=new CoreLab.MySql.MySqlCommand(insertSql,this.mySqlConnection1);
parm=adapter.InsertCommand.Parameters.Add("@id",CoreLab.MySql.MySqlType.Int,4,"id");
parm.SourceVersion=DataRowVersion.Current;
parm.SourceColumn="id"; parm=adapter.InsertCommand.Parameters.Add("@ox",CoreLab.MySql.MySqlType.Double,8,"ox");
parm.SourceVersion=DataRowVersion.Current;
parm.SourceColumn="ox"; parm=adapter.InsertCommand.Parameters.Add("@oy",CoreLab.MySql.MySqlType.Double,8,"oy");
parm.SourceVersion=DataRowVersion.Current;
parm.SourceColumn="oy"; parm=adapter.InsertCommand.Parameters.Add("@name",CoreLab.MySql.MySqlType.Char,8,"name");
parm.SourceVersion=DataRowVersion.Current;
parm.SourceColumn="name"; this.progressBar1.Value=i+1;
ds.Tables[0].Rows.Add(new object[]{i,ox,oy,name});////重要
adapter.Update(ds.Tables[0]);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
string strSql="";
for(int i=1;i<3;i++)
{
strSql = "insert into test.sima values ("+i+",1.2,1.3,5)";
sb.Append(strSql);
}
MySql.Data.MySqlClient.MySqlCommand cmd = new MySqlCommand(sb.ToString(),cn);
public void InsertRow(string myConnectionString)
{
// If the connection string is null, use a default.
if(myConnectionString == "")
{
myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass";
}
MySqlConnection myConnection = new MySqlConnection(myConnectionString);
string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)";
MySqlCommand myCommand = new MySqlCommand(myInsertQuery);
myCommand.Connection = myConnection;
myConnection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
}
以下是条通知后的代码:速度还是将近1分钟....
MySql.Data.MySqlClient.MySqlConnection cn = new MySqlConnection(this.strCn);
cn.Open();
this.progressBar1.Maximum=1000;
System.Text.StringBuilder sb = new System.Text.StringBuilder();
string strSql="";
for(int i=1;i<=1000;i++)
{
strSql = "insert into test.sima values ("+i+",1.2,1.3,5)";
sb.Append(strSql+";");
this.progressBar1.Value=i;
}
MySql.Data.MySqlClient.MySqlCommand cmd = new MySqlCommand(sb.ToString(),cn);
cmd.ExecuteNonQuery();
cn.Close();
修改一下你的insert语句,把字段名都指定,看看是否不一样?
string strSql ="insert into test.sima (id,ox,oy,name) values (?,?,?,?)";
而MYSQL、sql server、oracle数据库在设计过程中考虑到太多的并发、事务等因素,所以你会感觉到比ACCESS慢,这是很正常的。
我认为现在的速度都是正常的了,无法再提升了。