我正在检查用户是否存在于数据库中。我的数据库有5000万条记录。在插入新记录之前,哪种方法可以高效地检查用户是否存在?
我试着同时查数据库和字典,但我不知道哪一个是最好的方法。
我的任务:
编写一个控制台应用程序来生成一个强密码并将其存储在数据库中。我们希望在数据库表中有这样的5000万个密码。密码的长度为20个字符。密码包含大写、小写、数字和特殊字符的组合。数据库不包含重复条目。在单个事务中,批量输入是不允许的。2例如,你可以插入一个单一的记录到数据库中。3最好在最短的时间内完成整个工作。4一旦工作完成。
我的代码:
public partial class Program
{
static void Main(string[] args)
{
string input;
var watch = new Stopwatch();
while(true)
{
Console.WriteLine("Press 'i' for insertion and 'q' for quit:");
input = Console.ReadLine();
if(input=="q")
{
break;
}
if(input=="i")
{
watch.Start();
DataBaseConnection.InsertRecord();
watch.Stop();
TimeSpan ts = watch.Elapsed;
Console.WriteLine("Total time:" + ts.Milliseconds);
}
}
}
private static Random random = new Random();
public static string RandomString(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
"1234567890~`!@#$%^&*()_-+={[}]|\\:;\"'<,>.?/";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
}
}
public class DataBaseConnection
{
const string CONNECTION_STRING = "Data Source=(LocalDB)\\MSSQLLocalDB;" +
"Initial Catalog=assignment1;Integrated Security=True";
public static void InsertRecord()
{
SqlConnection connection= new SqlConnection(CONNECTION_STRING);
try
{
connection.Open();
//string password = "tS`*[H,j`~:Yr1Ome@Zk";
string password =Program.RandomString(20);
if (IsPasswordExists(connection,password))
{
return;
}
string query = "insert into PasswordTable values (@val)";
using(SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@val", password);
command.ExecuteNonQuery();
}
//Console.WriteLine("Password inserted successfully.");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
connection.Close();
}
}
public static bool IsPasswordExists(SqlConnection connection, string value)
{
bool result = false;
string query = "select * from PasswordTable where value=@value";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@value", value);
SqlDataAdapter dataAdapter = new SqlDataAdapter();
dataAdapter.SelectCommand = command;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet, "T1");
if (dataSet.Tables["T1"].Rows.Count > 0)
{
Console.WriteLine("Password already exists in Database.");
result = true;
}
}
return result;
}
}
1条答案
按热度按时间jhdbpxl91#
将数据库中的所有数据都存储在字典中,然后在字典中进行搜索,这是效率不高的。这是因为字典是在内存中实现的,5000万条记录是一个很大的数字。
你可以直接查询数据库来检查用户是否存在。2这允许你使用数据库的索引和优化功能来快速定位所需的记录。
为了提高性能,您可以考虑索引(但它也有缺点)。
可以使用高速缓存来将频繁访问的记录存储在存储器中。
但坦率地说,在不了解全部细节的情况下,这个问题没有完美的答案。