Database 查询大型非索引表

Database 查询大型非索引表,database,Database,我们正在为我们的应用程序开发一个类似CRUD的web界面。为此,我们需要显示来自不同表的数据。有些是巨大的,非常“活着”,有许多行(百万)。有些是小型的配置表 现在,我们希望允许用户在显示的网格上进行过滤、细化、排序、分页等操作。作为用户选择的结果,我们正在构建select查询 出于显而易见的原因,对未编制索引的字段进行筛选将产生一个运行时间相当长的查询。另一方面,索引表的每一列看起来有点“怪异”。我们有超过50行的桌子 我们正在研究ApacheLucene,但据我所知,它很好地帮助我们解决了文

我们正在为我们的应用程序开发一个类似CRUD的web界面。为此,我们需要显示来自不同表的数据。有些是巨大的,非常“活着”,有许多行(百万)。有些是小型的配置表

现在,我们希望允许用户在显示的网格上进行过滤、细化、排序、分页等操作。作为用户选择的结果,我们正在构建select查询

出于显而易见的原因,对未编制索引的字段进行筛选将产生一个运行时间相当长的查询。另一方面,索引表的每一列看起来有点“怪异”。我们有超过50行的桌子

我们正在研究ApacheLucene,但据我所知,它很好地帮助我们解决了文本索引问题。但是数字、日期、范围呢?对于上述问题是否有任何解决方案和讨论


另外,我必须指出,这个问题只针对用户体验。对于所有应用程序自身的需要,我们都做得很好。

您是正确的,一般来说,您不希望允许在非索引字段上使用随机谓词,但是这有多大影响取决于表大小、使用的数据库引擎和用于驱动数据库的机器。有些引擎对于非索引列不是很糟糕,但在最坏的情况下,每个引擎都会退化为顺序扫描。顺序扫描也并不总是像听起来那么糟糕

一些想法

  • 研究使用列存储数据库引擎,这些引擎按列存储数据,而不是按行存储数据,这对于非索引列上的随机谓词来说要快得多。但是,如果您经常需要一行中的所有字段,那么列存储并不是一个通用的解决方案
  • 索引将由用户查询的主列,并在UX层中指示对某些列的查询速度较慢。用户将更容易接受,尤其是如果他们事先知道列查询速度会很慢的话
  • 如果可能的话,把记忆扔向它。像oracle或sql/server这样的引擎将非常好,而您的大多数数据库都可以放在内存中。唯一的问题是,一旦数据库超过内存,性能就会下降(没有警告)
  • 如果可能,考虑使用垂直分区。这使您可以将一行拆分为两个或多个部分进行存储,这可以减少谓词的IO
  • 确保您知道这一点,但确保用于联接的列已编制索引

  • 你为什么不试试某种类型的数据仓库呢?你不能既吃布丁,又吃布丁(就像他们说的那样)。