【发布时间】:2010-12-23 10:33:02
【问题描述】:
我们的 Mnesia DB 运行缓慢,我们认为它应该更快一些。
所以我们需要对其进行分析并弄清楚发生了什么。
有许多建议自己的选项:
- 运行 fprof 并查看时间去向
- 运行 cprof 并查看哪些函数被调用了很多
不过,这些都是相当标准的性能监控风格工具。问题是我如何实际进行查询分析 - 哪些查询花费的时间最长。如果我们是 Oracle 或 MySQL 商店,我们将只运行一个查询分析器,它会返回需要很长时间才能运行的各种查询。这似乎不是 Mnesia 可用的工具。
所以问题是:
- 有哪些技术可以用来分析 Mnesia
- 存在哪些工具来分析 Mnesia - 我认为没有,但证明我错了 :)
- 您是如何分析您的查询并优化您的 mnesia 数据库安装的
根据讨论展开
fprof 作为分析工具的一个问题是它只告诉您正在查看的特定查询。所以 fprof 告诉我 X 很慢,我将其调低以加快速度。然后,低,看,操作 Y(足够快)现在变得很慢。所以我分析了 Y 并意识到让 Y 快的方法就是让 X 慢。所以我最终做了一系列的双边权衡……
我真正需要的是一种管理多边权衡的方法。我现在记录了 2 个度量标准的实际用户活动负载,我可以重播这些活动。这些日志代表了我想要优化的内容。
SQL 数据库上的“适当”查询分析器将能够分析 SQL 语句的结构,例如所有具有以下形式的语句:
SELECT [fieldset] FROM [table] WHERE {field = *parameter*}, {field = *parameter*}
说 285 个这种形式的查询平均需要 0.37 毫秒来运行
他们神奇的答案是当它说:这种形式的 17 个查询运行了 6.34 秒并对表 X 进行了全表扫描,你应该在字段 Y 上放置一个索引
当我在一组具有代表性的用户活动中获得这样的结果集时,我就可以开始考虑全面权衡取舍 - 并设计一个测试模式。
测试模式类似于:
- 活动 X 将进行查询 A、C 和 C 更快,但查询 E 和 F 较慢
- 测试和测量
- 然后批准/不批准
我已经使用 Erlang 足够长的时间来“知道”没有像这样的查询分析器,我想知道其他人(他们一定有这个问题)是如何对 mnesia 优化的“原因”。
【问题讨论】:
标签: database erlang profiling mnesia