我正在为我的项目开发一个问题记录器,并在分析记录的数据时遇到问题。问题是这个表增长得非常快,并且用于搜索表中数据的过滤器几乎可以在各个方面变化,因为我们并不总是对相同的字段感兴趣。所以索引不是一个真正的选择。
该表当前位于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秒的情况下获得结果。我可以使用哪些技术?
我们非常感谢任何建议。
答案 0 :(得分:1)
首先,什么是“永远”?我们在这里谈了多久?
第二次开始索引。我知道你可以搜索任何字段,但8个索引有什么问题?
如果您没有索引,它将进行表扫描以查找信息,这将会很慢。
此外,如果您一直在一个字段上搜索,您可能会考虑在该字段上执行聚簇索引。
修改强>
另一个选项,保持您的日志表不变。然后创建一些作业(每小时?)来组织你的数据。例如,我们有一个EventLog表。我们只插入该表。然后我们将EventsByDate,EventsByHour,EventsByAccountId等作为单独的表。然后将它们编入索引,我们点击它们来查看数据。
这允许您不定义索引,并使插入尽可能快,同时能够以合理的速率搜索数据。
答案 1 :(得分:1)
您可以考虑partitioning您的牌桌。在许多情况下,某种基于日期的分区很有意义。否则,如果您永远不会查询多个类型或者您可以单独管理类型,则可以按类型进行分区。分区的关键是永远不要跨越查询中的分区。 “永远”的表格确实需要在某个时刻进行分区或清理。很少有应用程序可以无限扩展。
答案 2 :(得分:1)
首先,您应该决定是否要留在RDBMSes土地上。如今对于大多数场景来说没有多大意义,尤其是那些具有复杂数据结构或需要大量扩展的场景。
您可能想要检查RavenDB。你可以在几小时内得到一个原型,包括最初的概念学习。
索引在任何地方都是必需的,绝对在任何NoSQL中也是如此。真正的问题是创建和维护它们是多么容易。使用RavenDB,您可以获得免提索引;根据您所进行的查询类型,您可以随时自动创建索引。建议预先定义它们以减少陈旧性,但是当它们自动创建时它们也是相同的索引。
我在另一个答案中看到你用Mongo解决了这个问题;好吧,使用Raven,您无需定义索引,但它们将为您创建。