首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server中MySQL表的高效更新

问Server中MySQL表的高效更新
EN

Stack Overflow用户
提问于 2009-03-09 23:36:38
回答 2查看 4.4K关注 0票数 2

我们有一个MySQL数据库(主要是只读的,所以是MyISAM表),它位于数据中心,可以与现场的Server进行对话。WAN (超过100 is )有一些明显的延迟;大约6个月后,Server将上升到数据中心(例如,相同的千兆局域网)。

在Server中,我需要从Server数据库中的结果中更新数千行。MySQL DB连接到一个运行在Linux上的rails应用程序上,所以我希望保留逻辑,以便在shell脚本或rake/ruby任务中尽可能地迁移数据(我们不是windows应用程序开发人员,所以Win32应用程序之类的东西很快就会出来!)

这是一个相当简单的过程。伪码:

代码语言:javascript
复制
SELECT id
     , amount
  FROM bank_account.on_SQL_Server
 WHERE (some logic)

FOREACH ROW:
  UPDATE bank_account.on_MySQL
     SET amount = $some_amount
   WHERE id     = $some_id

让我们假设有数千行需要频繁更新和执行(每5分钟一次)。还假设我无法知道Server中的哪些行发生了金额更改(不幸的是!)所以我不能把它限制在修改过的行上--我必须把它们全部发送出去(太糟糕了,但Server是一个第三方应用程序,不能修改编辑:我们确实控制了DBMS,所以我们可以做一些简单的修改,比如表上的触发器或新的存储过程--只是没有表模式更改来添加,比如最后一次更新的列--但是我想把这个选项保存为最后的)。

如何最好地完成此更新过程以最小化运行时?这个过程需要每隔几分钟运行一次(越快越好),从Ruby发出到Server和MySQL的双重连接太慢了。它可能是由MyISAM引擎发出的一些写表锁,但是转换到Innodb似乎并没有使它变得更快(系统正在测试中,因此很难模拟生产将收到的相同类型的负载,这使我相信它与锁无关)。

目前,我倾向于将一个视图(对应于上面的SQL server语句)转到一个文件,FTP‘’ing到Linux服务器,然后使用Ruby提前处理该文件(并执行大量序列化的SQL语句),但我不得不设想有更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-10 15:40:44

可以按照MySQL将这些指示作为链接服务器添加到server中

从这里,您可以在mysql表和mssql表之间做一些不相等的连接,并相应地更新它们。然后,您可以将其作为SQL作业运行,使数据库每5分钟同步一次。

例如:

代码语言:javascript
复制
SELECT * FROM mysql.dbo.bank_account myb 
INNER JOIN bank_account sqlb 
ON myb.id = sqlb.id 
AND sqlb.amount <> myb.amount

一旦您可以从SQL Server内部查询使用较少资源的mysql表,可能会有更明智的方法来判断哪些数据已经更改,但这是一个开始。

票数 1
EN

Stack Overflow用户

发布于 2009-03-10 00:17:56

您可以将另一个表添加到MSSQL端,以免通过缓存旧值或通过触发器(恶心)找到更新的行。

与此正交,您可能会看到是否有一个MySQL引擎提供MSSQL的远程视图,就像联邦发动机为MySQL所做的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/628447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档