我在 Amazon RDS 实例上运行缓慢的 Mysql 存储过程时遇到问题。
我目前正在使用存储过程将客户端的Mysql数据库迁移到我们自己的Mysql数据库。两个数据库位于同一个 RDS 实例上。实例类是'db.m1.medium'。
一个存储过程将大约 2.600.000 条记录从客户端数据库中的一个表复制到我们数据库中的两个表。
在我的笔记本电脑上的数据库的本地副本上运行此存储过程时,需要 1 小时 15 分钟。在 RDS 实例上运行此存储过程时,大约需要 19 小时。我正在从同一可用区中的 EC2 实例调用存储过程。
是否可以使存储过程在 RDS 实例上运行得更快?
编辑 27-01-2015:昨晚,由于内存不足异常,存储过程崩溃。
我现在更改了存储过程。对于原始表中的每一行,我将所有插入包装在一个事务中。我还为在存储过程中执行的一些选择查询做了一个解决方法,因此我不必再执行它们了。
我还为 RDS 实例提供了一个 30 GB 的 SSD 驱动器。
现在,存储过程在我的笔记本电脑上运行 12 分钟。但我估计在亚马逊 RDS 上仍然需要 8 个小时。这么大的差异怎么可能?
编辑 28-01-2015:该过程仍在运行。估计时间现已增加到 31 小时 15 分钟。
当我监控我的 RDS 实例时,可用内存量不断下降。存储过程中是否存在内存泄漏?
过去几年制造的普通笔记本电脑将比m1.medium
实例强大得多。它为您提供 1 vCPU
和 1.7 GB 的 RAM,在 m1 行上是"相当于 1.0-1.2 GHz 2007 皓龙或 2007 至强处理器的 CPU 容量"。
考虑迁移到 m3 实例 - 它们拥有更现代的处理器 - 并升级到具有更多 RAM 的更大实例样式。
如何在 RDS MySQL DB 中编写存储过程?
这是一个例子:
USE `your_db_name`;
DROP procedure IF EXISTS `procedure_method_name_here`;
DELIMITER $$
USE `your_db_name`$$
CREATE PROCEDURE `procedure_method_name_here` ()
BEGIN
// sql statement
SELECT *
FROM db_name.table_name
WHERE id = match_ids;
END$$
DELIMITER ;
运行上面的命令。您的程序将为您创建。