2025-11-09
LiteDB
00

目录

索引的重要性
Nuget 安装LiteDb
索引创建示例
User类
索引最佳实践
查询性能分析
查询性能监控
查询优化技巧
查询性能对比示例
大数据量处理技巧
批量操作优化
注意事项
结语

索引的重要性

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

Nuget 安装LiteDb

image.png

索引创建示例

User类

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(); } } } }

image.png

索引最佳实践

  • 为经常用于查询和排序的字段创建索引
  • 避免过度索引,每个索引都会增加写入开销
  • 对于复杂查询,考虑复合索引
  • 定期评估和重建索引

查询性能分析

查询性能监控

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}"); } } }

image.png

查询优化技巧

  1. 使用 Find() 代替 FindAll()
  2. 利用索引进行高效过滤
  3. 避免不必要的大量数据加载
  4. 使用 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); } } } }

image.png

注意事项

  • LiteDB 适合中小型应用
  • 对于超大规模数据,考虑使用专业数据库
  • 合理使用索引
  • 避免不必要的大量数据加载
  • 使用事务和批量操作
  • 定期监控和分析查询性能
  • 根据具体业务场景调整优化策略

结语

这段代码展示了LiteDB在C#中的基本应用,包含了数据库的创建、索引设置和数据操作等核心功能。通过创建单字段索引、复合索引和唯一索引,以及展示批量插入数据和多样化的查询操作,很好地体现了LiteDB作为轻量级NoSQL数据库的特点。代码结构清晰,示例丰富,非常适合作为入门LiteDB的参考示例,对理解文档型数据库的基本操作很有帮助。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!