2

目前我有一个存储在数据库中的大数据。

这组数据(3000 条记录)将被用户频繁检索。

目前我正在使用的方法是:

  1. 从数据库中检索这组记录
  2. 转换成数据表
  3. 存储到缓存对象中
  4. 基于查询的此缓存对象的搜索结果

    CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text));
    
  5. 将结果绑定到转发器(每页显示 40 条记录的分页)

但是我注意到性能不好(每个请求大约需要 4 秒)。所以,我想知道有没有更好的方法来做到这一点?或者我应该立即从数据库中检索每个查询的结果?

4

3 回答 3

3

DataTable.Select可能不是搜索内存缓存的最有效方法,但搜索 3000 行肯定不应该花费 4 秒或任何类似的时间。

第一步是找出你的性能瓶颈在哪里。我打赌这与搜索缓存无关,但您可以轻松找到,例如使用类似以下的代码:

var stopwatch = Stopwatch.StartNew();
var result = CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text));

WriteToLog("Read from cache took {0} ms", stopwatch.Elapsed.TotalMilliseconds);

WriteToLog某处进行跟踪(例如 System.Diagnostics.Trace、System.Diagnostics.Debug 或 log4net 等日志框架)。

如果您正在寻找缓存的替代方案,您可以简单地缓存实体对象的通用列表,并使用 Linq 搜索列表:

var result = CachePostData.Select(x => x.Name.Contains(txtItemName.Text));

这可能稍微高效一些(例如,它不需要解析“NAME LIKE ...”过滤器表达式),但同样,我不认为这是你的瓶颈。

于 2013-10-26T16:45:53.623 回答
2

我认为使用数据表会更有效,因为这样做可以减少对数据库服务器的访问。您可以将数据表存储在缓存中,然后重用它。像这样的东西: -

public DataTable myDatatable()
{
   DataTable dt = HttpContext.Current.Cache["key"] as DataTable;
   if(dt == null)
   {
       dt = myDatatable();
       HttpContext.Current.Cache["key"] = dt;
   }
   return dt;
}

还要检查SqlCacheDependency

您也可以像这样在某个特定时间间隔清除缓存:-

HttpContext.Current.Cache.Insert("key", dt, null, DateTime.Now.AddHours(2), 
System.Web.Caching.Cache.NoSlidingExpiration);

还要检查DataTable 缓存性能

于 2013-10-26T13:29:56.123 回答
2

在不知道您实际期望的数据库命中次数的情况下,为您的问题声明一个正确的解决方案有点困难。在大多数情况下,我不会将数据缓存在 ASP.NET 缓存中以进行过滤,因为通过 using 进行搜索DataTable.Select基本上执行的是表扫描,并且无法利用数据库索引。除非您遇到非常重的负载,否则大多数数据库服务器应该能够以比DataTable在 .NET 中过滤更少的延迟来执行此任务。

如果您的数据库支持全文搜索(即 MSSQL 或 MySQL),您可以在 name 列上创建全文索引并进行查询。LIKE全文搜索应该为这些类型的查询提供更快的响应类型。

通常,缓存数据以更快地访问是好的,但在这种情况下,在DataTable搜索数据方面很可能不如数据库服务器。您仍然可以使用缓存更快地显示未过滤的数据,而无需访问数据库。

于 2013-10-26T16:24:41.820 回答