我正在为我的项目开发问题记录器,并且在分析记录的数据时遇到问题。问题在于该表增长非常快,并且用于搜索表中数据的过滤器几乎可以在所有方面发生变化,这是因为我们并不总是对相同的字段感兴趣。因此,索引并不是真正的选择。

该表当前位于MySQL数据库上,具有以下结构:

CREATE TABLE `log_issues` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id_user` int(11) DEFAULT NULL,
  `type` varchar(50) NOT NULL,
  `title` varchar(100) NOT NULL DEFAULT '',
  `message` mediumtext NOT NULL,
  `debug` mediumtext,
  `duration` float DEFAULT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `date` (`date`,`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


现在我的问题是,当它具有数百万个条目时,如何在该表上运行查询而不必永远等待结果?例如,仅对用户ID进行过滤将永远花费。我知道我可以在id_user部分上放置一个索引,但是我可能希望将其与其他字段结合使用,或者由于查看这些日志的工具生成查询的方式,它可能无法正确利用索引。

我认为使用MongoDB或其他NoSQL数据库可能会更好,但是我对它们没有任何经验。基于文档的数据库是否可以更轻松地过滤没有索引的大型数据集,或者无论数据库如何,我总是会遇到这个问题吗?

总结一下:

我的表中包含大量数据,无法使用索引(如果需要排序,则不能使用索引),并且我需要获得结果而不必等待10秒钟以上。我可以使用哪些技术?

任何建议将不胜感激。

最佳答案

首先,您应该决定是否要保留在RDBMS中。如今,对于大多数情况,尤其是那些具有复杂数据结构或需要大量扩展的情况,这已经没有多大意义了。

您可能要检查RavenDB。您可以在数小时内获得使用它的原型,包括在那里初步了解概念。

索引在任何地方都是必需的,绝对在任何NoSQL中也是如此。真正的问题是创建和维护它们有多容易。使用RavenDB,您可以获得免提索引功能;索引会根据您执行的查询类型自动创建。建议预先定义它们以减少陈旧性,但是​​在自动创建它们时,它们也是相同的索引。

我在另一个答案中看到您通过Mongo解决了这个问题;好吧,使用Raven,您不必定义索引,但会为您创建索引。

09-25 17:42
查看更多