在c#中的数据库中通过id查找记录的最快方法是什么?

我已经使用DataContext.CreateDatabase创建了一个数据库并在其中插入了记录。在c#中的数据库中通过id查找记录的最快方法是什么?

有很多的在它的记录,所以我想找到一个记录由它的最快的方法ID。

首先我想:

foreach (var currentRecord in _context.Cities) 

{

if (currentRecord.ID == recordIdToFind)

return currentRecord;

}

,但它是非常缓慢的,所以我把它改为:

var recordToReturn = from r in _context.Cities 

where r.ID == recordIdToFind

select r;

return recordToReturn.FirstOrDefault();

,并得到更快。

有没有更好的方法?

回答:

无论您正在搜索的(定期)需要在数据库中具有最佳的速度上定义的索引。请注意,某些列和某些类型的搜索不能很好地进行索引(例如,大型文本字段或“包含”搜索),并且可能需要不同类型的索引(全文)。就你而言,看起来你正在使用主键,它应该有一个聚集索引。

一旦你定义的索引(ES),你再要执行走索引的优势查询。第一个查询执行全表扫描,将所有结果加载到内存中,然后在代码中遍历它们。您尚未给数据库任何机会来帮助您加速查询,并且传输的数据量远远超过您的需求。第二个查询允许数据库通过添加指定索引列的where子句来使用索引来查找您感兴趣的行。如果单独进行(即,您只查找这一行,而不是按顺序查找每行),那么它是最优的。它为该行执行索引查找,然后将该行传输到应用程序。

如果它实际上是主键,那么可以通过使用SingleOrDefault来提高可读性,尽管不是性能,因为表中只能有一行包含该键。如果您有一列您希望是唯一但不是主键的列,那么强化查询的单一性也将有助于检测潜在错误,但不会在主键上下文中检测到。在这种情况下,如果找到多个结果,则SingleOrDefault将引发异常,而FirstOrDefault将仅仅选择集合中的第一个,而不会提供有关不一致的任何信息。

回答:

你的第二个代码示例应该做到这一点

回答:

第二个得到更快的最快的方法,因为它会产生一个WHERE子句,查询数据库,仅返回匹配的行到你的应用程序时,像WHERE ID = <whatever>

第一个是缓慢的,因为它遍布读取来自城市数据库表中,并将它们复制每一条记录到你的应用程序,它丢弃所有,但他们中的一个。

如果您还没有一个已经,在城市表的ID列的索引(或更可能是主键)将使这一更快,特别是当你添加更多的数据表。

回答:

LINQ的声明是因为它得到一样好。在底层,它必须将linq语句和firstordefault转换为SQL服务器的语句。并在检索结果时将其映射到城市对象中。

所以它实际上被作为该准备好的声明一个类似于:

SELECT TOP 1 * FROM Cities where [email protected] 

理论上可以加速它自己发送准备好的声明如下,但它不会给你城市的目的,是在大多数情况下不会明显更快:(让我重复一遍,这不太可能是您想要做的,但它是获取数据的更快方式)

string commandText = "SELECT TOP 1 * FROM Cities where [email protected];"; 

using (SqlConnection connection = new SqlConnection(connectionString))

{

SqlCommand command = new SqlCommand(commandText, connection);

command.Parameters.Add("@ID", SqlDbType.Int);

command.Parameters["@ID"].Value = recordIdToFind;

connection.Open();

SqlDataReader reader = command.ExecuteReader();

try

{

while (reader.Read())

{

Console.WriteLine(String.Format("{0}, {1}",

reader[0], reader[1]));

}

}

finally

{

// Always call Close when done reading.

reader.Close();

}

}

以上是 在c#中的数据库中通过id查找记录的最快方法是什么? 的全部内容, 来源链接: utcz.com/qa/261105.html

回到顶部