从数据表(缓存对象)与数据库中搜索项目

本文关键字:数据库 搜索 项目 数据表 缓存 对象 | 更新日期: 2023-09-27 18:37:06

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

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

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

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

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

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

从数据表(缓存对象)与数据库中搜索项目

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 ..."过滤器表达式),但同样,我不希望这是您的瓶颈。

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

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

还要检查数据表缓存性能

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

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

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