在 LiteDB 中,索引是提升查询性能的关键机制。正确的索引策略可以显著减少查询时间,尤其是在处理大规模数据集时。

C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App11
{
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
}
C#using LiteDB;
namespace App11
{
internal class Program
{
static void Main(string[] args)
{
using (var db = new LiteDatabase(@"MyDatabase.db"))
{
// 获取用户集合
var users = db.GetCollection<User>("users");
// 创建单字段索引
users.EnsureIndex(x => x.Username);
// 创建复合索引
users.EnsureIndex(x => new { x.Username, x.Email });
// 唯一索引,确保字段值唯一
users.EnsureIndex(x => x.Email, unique: true);
// 插入10条测试记录
var testUsers = new List<User>
{
new User { Id = 1, Username = "john_doe", Email = "john@example.com", Age = 25 },
new User { Id = 2, Username = "jane_smith", Email = "jane@example.com", Age = 28 },
new User { Id = 3, Username = "mike_wilson", Email = "mike@example.com", Age = 32 },
new User { Id = 4, Username = "sarah_jones", Email = "sarah@example.com", Age = 24 },
new User { Id = 5, Username = "david_brown", Email = "david@example.com", Age = 35 },
new User { Id = 6, Username = "emma_davis", Email = "emma@example.com", Age = 27 },
new User { Id = 7, Username = "alex_taylor", Email = "alex@example.com", Age = 31 },
new User { Id = 8, Username = "lisa_anderson", Email = "lisa@example.com", Age = 29 },
new User { Id = 9, Username = "tom_miller", Email = "tom@example.com", Age = 33 },
new User { Id = 10, Username = "anna_white", Email = "anna@example.com", Age = 26 }
};
// 插入记录
users.InsertBulk(testUsers);
// 示例查询操作
// 查找所有年龄大于30的用户
var over30 = users.Find(x => x.Age > 30).ToList();
Console.WriteLine($"Over 30: {string.Join(", ", over30.Select(x => x.Username))}");
// 按用户名查找
var userJohn = users.FindOne(x => x.Username == "john_doe");
Console.WriteLine($"John Doe: {userJohn.Email}");
// 使用复合索引查找
var userByEmailAndUsername = users.FindOne(x => x.Username == "emma_davis" && x.Email == "emma@example.com");
Console.WriteLine($"Emma Davis: {userByEmailAndUsername.Age}");
Console.ReadKey();
}
}
}
}

C#using System.Diagnostics;
using LiteDB;
namespace App11
{
internal class Program
{
static void Main(string[] args)
{
using (var db = new LiteDatabase(@"MyDatabase.db"))
{
// 获取用户集合
var users = db.GetCollection<User>("users");
// 分析查询性能
AnalyzeQueryPerformance(users);
}
}
public static void AnalyzeQueryPerformance(ILiteCollection<User> users)
{
// 使用 Stopwatch 测量查询执行时间
var stopwatch = new Stopwatch();
stopwatch.Start();
var results = users
.Find(x => x.Age > 25)
.OrderBy(x => x.Username)
.ToList();
stopwatch.Stop();
Console.WriteLine($"查询耗时: {stopwatch.ElapsedMilliseconds} ms");
Console.WriteLine($"返回记录数: {results.Count}");
}
}
}

Find() 代替 FindAll()Take() 和 Skip() 进行分页C#using System.Diagnostics;
using LiteDB;
namespace App11
{
internal class Program
{
static void Main(string[] args)
{
using (var db = new LiteDatabase(@"MyDatabase.db"))
{
// 获取用户集合
var users = db.GetCollection<User>("users");
// 分析查询性能
CompareQueryStrategies(users);
}
}
public static void CompareQueryStrategies(ILiteCollection<User> users)
{
// 未索引查询(性能较差)
var slowQuery = users.Find(x => x.Username.Contains("john"));
// 使用索引的快速查询
users.EnsureIndex(x => x.Username);
var fastQuery = users.Find(x => x.Username.Contains("john"));
}
}
}
C#using System.Diagnostics;
using LiteDB;
namespace App11
{
internal class Program
{
static void Main(string[] args)
{
// 初始化10条测试数据
var users = new List<User>();
for (int i = 1; i <= 10; i++)
{
users.Add(new User
{
Id = new Random().Next(100,1000),
Username = $"User{i}",
Email = $"user{i}@example.com",
Age = i * 10
});
}
BulkInsertOptimization(users);
}
public static void BulkInsertOptimization(List<User> largeUserList)
{
using (var db = new LiteDatabase(@"MyDatabase.db"))
{
var users = db.GetCollection<User>("users");
// 禁用临时索引以提高批量插入性能
users.EnsureIndex(x => x.Email);
try
{
// 开启事务
db.BeginTrans();
// 批量插入
users.InsertBulk(largeUserList);
// 提交事务
db.Commit();
}
catch (Exception ex)
{
// 回滚事务
db.Rollback();
Console.WriteLine($"批量插入失败: {ex.Message}");
}
// 重建索引
users.EnsureIndex(x => x.Email);
}
}
}
}

这段代码展示了LiteDB在C#中的基本应用,包含了数据库的创建、索引设置和数据操作等核心功能。通过创建单字段索引、复合索引和唯一索引,以及展示批量插入数据和多样化的查询操作,很好地体现了LiteDB作为轻量级NoSQL数据库的特点。代码结构清晰,示例丰富,非常适合作为入门LiteDB的参考示例,对理解文档型数据库的基本操作很有帮助。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!