我有一张桌子,其结构如下:
ID, SourceID, EventId, Starttime, Stoptime所有ID列都是char(36),时间是日期。
问题是查询表的速度真的很慢。我有七百万行,我有大约60-70个线程一直在写(插入或更新)到表。
另一方面,我有需要从这个表读取的GUI,它就在这里,它变得很慢。如果我想选择所有的事件已经成为where SourceID = something,它需要近300秒。SourceID有一个索引。我使用相同的查询,并将explain关键字放在第一个,我得到了这个。
select type = simple
type = ref
possible_keys = sourceidnevent,sourceid
key = soruceid
key_len = 109
ref = const
rows = 84148和查询
SELECT * FROM tabel where sourceid='28B791C7-D519-4F0C-BC03-EFB1D4AC9CEB'然而,我开始思考我真正需要从桌子上得到什么。我想知道哪个事件发生在哪个服务器上,以及哪个事件发生在服务器上,按日期排序。我为所有使用where和order的组合添加了索引。
我需要所有的行,因为我想对它们做一些计算,一些分组,平均等等。但我是在.NET环境下做的,而不是问很多问题。
但是,如果我对select添加了一个限制,它就会运行得更快。那么瓶颈是数据的传输量,而不是实际的查找/选择部分吗?如果是这样的话,我可以重新构建我的应用程序,只在一天内完成计算,并将结果保存到另一个表中,然后将所有结果聚合起来。
我怎样才能加快进度?切换到MongoDB会更好吗?我目前使用MySQL和InnoDB。
发布于 2012-09-05 08:23:30
这里有很多你没有提供的信息--我在其他地方的评论中提到了其中的一些。
在单个节点上,NoSQL不太可能比MySQL快得多。如果它比在MySQL上使用MySQL和批准索引的速度更快,我会感到非常惊讶。
您已经提供了解释计划的一部分(但没有解释查询),但您没有提供任何解释:
行= 84148
它真的需要处理那么多行来提供所需的结果吗?如果是这样,并且结果不是聚合的,那么您可能需要考虑为什么需要将80k行数据发送到前端。如果它只需要返回几个非聚合行,那么您确实需要分析您的索引。
我增加了所有组合的索引
太多的索引和太少的索引一样不利于性能。
https://stackoverflow.com/questions/12275765
复制相似问题