具有大量条目的易于过滤的数据库表

时间:2011-06-13 13:44:54

标签: mysql mongodb performance database nosql

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

该表当前位于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秒的情况下获得结果。我可以使用哪些技术?

我们非常感谢任何建议。

3 个答案:

答案 0 :(得分:1)

首先,什么是“永远”?我们在这里谈了多久?

第二次开始索引。我知道你可以搜索任何字段,但8个索引有什么问题?

如果您没有索引,它将进行表扫描以查找信息,这将会很慢。

此外,如果您一直在一个字段上搜索,您可能会考虑在该字段上执行聚簇索引。

修改

另一个选项,保持您的日志表不变。然后创建一些作业(每小时?)来组织你的数据。例如,我们有一个EventLog表。我们只插入该表。然后我们将EventsByDate,EventsByHour,EventsByAccountId等作为单独的表。然后将它们编入索引,我们点击它们来查看数据。

这允许您不定义索引,并使插入尽可能快,同时能够以合理的速率搜索数据。

答案 1 :(得分:1)

您可以考虑partitioning您的牌桌。在许多情况下,某种基于日期的分区很有意义。否则,如果您永远不会查询多个类型或者您可以单独管理类型,则可以按类型进行分区。分区的关键是永远不要跨越查询中的分区。 “永远”的表格确实需要在某个时刻进行分区或清理。很少有应用程序可以无限扩展。

答案 2 :(得分:1)

首先,您应该决定是否要留在RDBMSes土地上。如今对于大多数场景来说没有多大意义,尤其是那些具有复杂数据结构或需要大量扩展的场景。

您可能想要检查RavenDB。你可以在几小时内得到一个原型,包括最初的概念学习。

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

我在另一个答案中看到你用Mongo解决了这个问题;好吧,使用Raven,您无需定义索引,但它们将为您创建。