在 LiteDB 中避免完全 table 扫描?
Avoid full table scan in LiteDB?
见代码:
var lines = new List<PosLine>(){
new PosLine{Name="John", Address="dummy1", Tstamp=DateTime.Now},
new PosLine{Name="Jane", Address="dummy2", Tstamp=DateTime.Now}
};
using(var db = new LiteDatabase(@"test.db"))
{
var posLines = db.GetCollection<PosLine>("POS");
foreach(var line in lines)
{
var id = posLines.Insert(line);
Console.WriteLine("id=" + id.ToString());
}
var names = posLines.FindAll().Select(p => p.Name).ToList();
foreach(var name in names)
{
Console.WriteLine("name=" + name);
}
}
行 var names = posLines.FindAll().Select(p => p.Name).ToList();
试图获取 "Name" 的列表,但在本例中,它是完整的 table 扫描。有没有办法避免完全 table 扫描,比如我在 "Name" 属性 上创建索引,然后从该索引中获取所有名称?
如果您正在阅读所有文档,您将永远避免完全扫描。使用 Name
中的索引可以进行全索引扫描(避免全 "table" 扫描)。这两个全扫描的区别在于反序列化时间和读取的数据量(索引全扫描要便宜得多)。
不幸的是,在当前版本的 LiteDB 中,您没有仅获取索引键的选项。这很容易实现,所以在 github 上提出一个问题,可以在下一个版本中实现。
见代码:
var lines = new List<PosLine>(){
new PosLine{Name="John", Address="dummy1", Tstamp=DateTime.Now},
new PosLine{Name="Jane", Address="dummy2", Tstamp=DateTime.Now}
};
using(var db = new LiteDatabase(@"test.db"))
{
var posLines = db.GetCollection<PosLine>("POS");
foreach(var line in lines)
{
var id = posLines.Insert(line);
Console.WriteLine("id=" + id.ToString());
}
var names = posLines.FindAll().Select(p => p.Name).ToList();
foreach(var name in names)
{
Console.WriteLine("name=" + name);
}
}
行 var names = posLines.FindAll().Select(p => p.Name).ToList();
试图获取 "Name" 的列表,但在本例中,它是完整的 table 扫描。有没有办法避免完全 table 扫描,比如我在 "Name" 属性 上创建索引,然后从该索引中获取所有名称?
如果您正在阅读所有文档,您将永远避免完全扫描。使用 Name
中的索引可以进行全索引扫描(避免全 "table" 扫描)。这两个全扫描的区别在于反序列化时间和读取的数据量(索引全扫描要便宜得多)。
不幸的是,在当前版本的 LiteDB 中,您没有仅获取索引键的选项。这很容易实现,所以在 github 上提出一个问题,可以在下一个版本中实现。