我有一个类似下面的课程,
class Student
{
public string Name {get; set;}
public string Surname {get; set;}
public int Age {get; set;}
public string Address {get; set;}
}
我有一个包含50,000条记录的MySql表。表的结构如下所示,
ID NAME SURNAME AGE ADDRESS
1 Joe Philip 20 Moscow
2 Misha Johny 25 London
...
我有一个C#代码,
List<Student> students = new List<Student>();
string sql = "SELECT name,surname,age,address FROM Students";
command.CommandText = sql;
MySqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
Student st = new Student();
st.Name = reader["Name"].ToString();
st.Surname = reader["Surname"].ToString();
st.Age = Convert.ToInt32(reader["Age"].ToString());
st.Address = reader["Address"].ToString();
students.Add(st);
}
但它的效果很慢。您建议使用哪种方法使此代码运行得更快?
更新:
当我使用此代码时,
DataTable dt = new DataTable();
adapter.Fill(dt);
效果很好,速度非常正常。但是我用自己的课程尝试的问题是什么?
答案 0 :(得分:5)
如果代码运行缓慢,最大的原因是有50,000条记录。您需要具有50,000 Student
个对象到底是什么?如果您能找到解决问题的方法而无需阅读所有这些记录并创建所有这些对象,那么代码就会更快。
<强>更新强>
使用你自己的课很好。这是因为你的代码是 I / O绑定(你花了大部分时间等待I / O)。为了避免所有这些I / O,您可以减少检索的数据量(可能通过消除数据中不相关的列或行)或通过更复杂的查询或存储过程对数据库进行处理。
更新2
要回答您的后续问题(为什么创建对象列表比获取DataSet
要慢),我希望将整个查询读取为DataSet
只会略快于对象创建。我不熟悉MySQL .NET库的实现方式。令我惊讶的是,这两种方法在速度上会有大的差异。也许MySqlDataReader
正在做一些像使用内部DataSet
一样愚蠢的事情。如果两者之间的性能差异很大,那么该库的作者可能应该修复它。
更新3
MySqlDataAdapter or MySqlDataReader for bulk transfer?的答案有一个很好的提示;设置阅读器的BatchSize
可能会有所帮助。如果批量大小对于读者而言太小,那么使用像你这样的大量记录会降低它的效率。
答案 1 :(得分:1)
使用记录索引而不是coulmname使性能更好一些 使用
st.Name = reader[0].ToString();
instead of
st.Name = reader["Name"].ToString();
and
st.Name = reader[0].ToString();
instead of
st.Name = reader["surname"].ToString();