我有一个程序,其中包含一个带有表的SQLite数据库:CREATE TABLE文件(路径TEXT,last_backup DATETIME)
总数据库大小为33Mb,其中包含约250000条记录。
我正在运行一个代码块,它会选择任何路径字段与字符串匹配的记录并返回last_backup DATETIME值。如果没有找到记录,则返回DateTime.MinValue。
当我最初运行程序时,数据库为空,因此每次都会返回最小日期。现在有很多记录要检查程序运行相同的进程要慢得多。
我查询表的代码块是:
internal DateTime lastBackupDate(String file)
{
DateTime date = DateTime.MinValue;
string sql = "SELECT * FROM files WHERE path=@param1";
SQLiteCommand command = new SQLiteCommand(sql, _connection);
command.Parameters.AddWithValue("@param1", file);
SQLiteDataReader reader = command.ExecuteReader();
while (reader.Read())
{
date = (DateTime)reader["last_backup"];
}
return date;
}
我的问题是,有什么办法可以加快速度吗?
答案 0 :(得分:3)
您应该构建SQL查询,以便只选择所需的记录,而不是从每一行读取数据:
SELECT max(last_backup) FROM files WHERE path=@param1
如果仍然很慢,您应该可以通过在path, last_backup
列上添加index来加快速度。使用索引可以加快数据库中的查询速度。 (就像保持你正在查找的东西HashSet<T>
或Dictionary<,>
的想法一样,这样就可以进行快速二进制搜索)
答案 1 :(得分:2)
如果您只需要一个字段,则只能返回一个字段而不是所有列:
SELECT last_backup FROM files WHERE path=@param1
此外,您的查询似乎可能会返回多行,但您只使用最后一行的备份日期。如果这是故意的,你可以尝试返回一行:
SELECT last_backup FROM files WHERE path=@param1 LIMIT 1
或者:
SELECT DISTINCT last_backup FROM files WHERE path=@param1
只是一些随意的想法......