我有一个具有以下结构的表:
ID, SourceID, EventId, Starttime, Stoptime
所有ID列都是char(36),时间是日期。
问题是查询表格真的很慢。我有7百万行,我有大约60-70个线程一直在写表(插入或更新)。
另一方面,我有需要从这个表中读取的GUI,它在这里变慢。如果我想选择所有已经发生的事件where SourceID = something
,则需要将近300秒。 SourceID有一个索引。我采取相同的查询,并把解释关键字放在第一位。我得到了这个。
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'
然而,我开始考虑从表中真正需要什么。我想知道在哪个服务器上发生了哪个事件,以及在服务器上发生了哪个事件,按日期排序。我为所有使用和按排序的组合添加了索引。
我需要所有的行,因为我想对它们进行一些计算,一些分组,avarage等等。但是我在.NET环境中这样做,因为他们提出了很多疑问。
但是,如果我为选择添加限制,它会更快。那么转移的数据量是不是瓶颈,而不是查找/选择部分?如果是这样,我可以重建我的应用程序,仅在一天内进行计算,并将结果保存到另一个表中,然后汇总所有表。
如何加快程序?切换到MongoDB会更好吗?我目前使用的是MySQL和InnoDB。
答案 0 :(得分:0)
这里有很多你没有提供的信息 - 其中一些我在其他地方的评论中提到过。
在单个节点上,NoSQL不可能比MySQL快得多。如果它比在MySQL上使用handler API以及适当的索引更快,我会感到非常惊讶。
您已提供解释计划的一部分(但未提供正在解释的查询) - 但您尚未对此提供任何解释:
rows = 84148
是否真的需要处理那么多行才能提供您需要的结果?如果是这样且结果没有汇总,那么您可能需要考虑为什么需要将80k行数据发送到前端。如果它只需要返回一些非聚合行,那么你真的需要分析你的索引。
我为所有组合添加了索引
太多的索引和性能一样差。