我正在为我的项目开发问题记录器,并且在分析记录的数据时遇到问题。问题在于该表增长非常快,并且用于搜索表中数据的过滤器几乎可以在所有方面发生变化,这是因为我们并不总是对相同的字段感兴趣。因此,索引并不是真正的选择。
该表当前位于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,您不必定义索引,但会为您创建索引。