情况描述:
现在的项目是先建数据库/表,然后根据数据库生成entities模型,再根据各个模型写各自的类,以读取数据。通常的作法是先把某一大类的数据读取出来,后续再对这一大类的数据根据需要做进一步的筛选。每次读取使用cache对数据缓存。比如
Public Function GetOrders (IsValid as Boolean) As List (Of Order)
Dim cacheKey As String = String.Format("Orders{0}", IsValid.ToString)
If Not IsNothing(Cache(cacheKey)) Then
Return CType(Cache(cacheKey), List(Of Order))
End If
Dim lOrders As List(Of Order) = (From lai As Oder In OrderContext.Orders() Where lai.IsValid = IsValid).ToList
CacheData(key, lSellViews, CacheDuration) 'CacheData是基类中的一个子程序
Return lOrders
End Function
Public Function GetOrders (IsValid as Boolean, OrderDate as Date) As List (Of Order)
Dim cacheKey As String = String.Format("Orders{0}Date{1}", IsValid.ToString, OrderDate.ToShortDateString)
If Not IsNothing(Cache(cacheKey)) Then
Return CType(Cache(cacheKey), List(Of Order))
End If
Dim lOrders As List(Of Order) = (From lai As Oder In GetOrders(IsValid) Where lai.OrderDate = OrderDate).ToList
CacheData(key, lSellViews, CacheDuration) 'CacheData是基类中的一个子程序
Return lOrders
End Function
假设数据库表中设了IsValid和OderDate两个非聚集索引。上述情况下,数据库的索引或许对第一个函数还有些用,因为是读取的数据库,第二个函数检测到有缓存的时候,就不会再读数据库,而是进内存中的缓存数据进行筛选。那么,数据库中的OrderDate索引是不是就没意义了?
------解决思路----------------------
既然没有任何地方会把OderDate作为条件,那么的确可以取消,但前提你得保证你不使用同时别人也不使用
------解决思路----------------------
就你的问题来说,显然意见,你内存中又没有用到什么数据库索引,它索引当然是没有意义的。
但是这个前提是,这里花哨的所谓缓存概念“玩儿的太过火”了。很少有公司会说“滥用内存无所谓,丢了无所谓,脏数据也无所谓,不支持多用户也无所谓,不索引也无所谓”,除非在某个培训班上个别的、拿人家项目不当回事的学生才如此。