1

我有一个带有静态表的数据库,需要每周从 CSV 更新。表是 Mysql MyISAM 并且静态我的意思是它们用于只读(显然从 CVS 更新时除外)。

大约有 50 个表,每周要重新加载大约 200mb 的数据。

我可以考虑3种方式:

  1. 截断表
  2. 从文件加载数据

或者

  1. 为每个表创建一个临时表
  2. 在那里加载数据
  3. 截断(或删除行?)原始表
  4. 从临时表中插入原始表选择 *。

或者

  1. 创建 table_new 并在那里加载数据
  2. 将原始表重命名为 table_old(或完全删除表)
  3. 将 table_new 重命名为原始表

你认为最有效的方法是什么?

4

4 回答 4

0

你总是可以做INSERT INTO ... ON DUPLICATE KEY UPDATE ...REPLACE INTO ...。您不应该有任何停机时间(在 TRUNCATE 和 INSERT 之间),而且腐败的可能性很小。

小心REPLACE,因为它实际上会删除每条记录并重新插入它,触发你可能拥有的任何触发器(在这种情况下不太可能),但如果你有一个自动增量字段,也会给你一个新的 ID。

于 2010-01-28T04:02:31.230 回答
0

您的第三个选项是最好的,您可以在导入时在 _new 表上 LOCK 和 DISABLE KEYS,它会特别快。您甚至可以将所有新表“批量原子重命名”为“当前表”,如果它们之间存在关系,则停机时间为零。

我假设整个表都包含在每周的 cvs 更新中(即它们不是增量的)。

于 2010-01-28T04:02:36.327 回答
0

我更喜欢第三种方法并保留旧表。

  1. 创建 table_new
  2. 如果存在则删除 table_old
  3. 将表重命名为 table_old
  4. 将 table_new 重命名为 table

这种方法的优点是快速、安全,对读者影响较小。新表的创建不会影响对现有表的读取。重命名操作更快(在 myisam 的情况下只是文件重命名),因此停机时间并不多。所以客户不会受到那么大的影响。您还必须保留旧数据,以防新数据出现问题。

由于您不会在线更新它,我认为如果您使用 myisampack 会很好。

于 2010-01-28T04:06:33.920 回答
0

你考虑过使用 mysqlimport 吗?你可以在这里阅读:http: //dev.mysql.com/doc/refman/5.1/en/mysqlimport.html

我可能不会对删除原始表做任何事情,因为那样你必须重新创建所有外键、索引、约束等,这是一团糟和维护的噩梦。重命名表也会导致问题(例如,如果您有表的同义词,我不确定 mysql 是否有同义词)。

然而,我要做的是在加载数据之前禁用这些键。

ALTER TABLE tbl_name DISABLE KEYS 

换句话说,在加载数据时,您不希望它尝试更新索引,因为这会减慢加载速度。您希望在加载完成后更新索引。

所以我认为通过将 mysqlimport 与上面的提示相结合,您应该能够获得真正有效的负载。

于 2009-12-29T04:51:22.097 回答