17

我需要将大型数据集加载到生产数据库中。

每个需要上传 15 个文件并插入到一个表中。每个约为500 Mb

我有两个需要索引的 ID 列。如果我加载带有索引的文件,上传大约需要 3 个小时。如果我删除索引,加载数据本地 infile,然后重新添加索引,整个操作大约需要 30 分钟。

问题是,在索引新导入的数据时,数据库响应能力会受到很大影响。有没有办法让索引以“低优先级”运行,以便其他查询仍然获得 95-100% 的速度,并且索引类型在后台运行?

我正在使用Amazon RDS,因此我无法选择仅在不同的服务器上加载然后复制表文件。

对此添加赏金,因为我仍然想看看是否有办法在对特定框进行索引时获得良好的性能。

4

6 回答 6

4

好吧,我从来没有找到节流的方法,但我确实找到了缓解问题的方法。该解决方案对我的问题来说是独一无二的,但我会发布它以防其他人发现它有用。

我写了一个名为CautiousIndexer.

  1. 首先,我存储了 create table 语句来重新创建没有索引的表结构。我存储了一组读取的从数据库,循环遍历它们,将未索引数据的表重命名为prevent_indexing_($name).
  2. 然后我只在从属服务器上运行 create table 语句。这有效地将数据移出索引语句的方式,这些语句将发生在主服务器上。
  3. 然后我对主服务器运行索引查询。由于新创建的表是空的,读取从属服务器在主服务器建立索引时没有性能影响。
  4. 当 master 完成索引时,我将 1 个 slave 退出生产轮换,删除空表,将完整表移回原位,然后在生产之外的 slave 上为 table 建立索引。
  5. 完成后,我将其重新投入生产,并在剩余的从站上重复从站索引过程。
  6. 当所有从站都被索引后,我将表投入生产。

这在效率方面仍然很好,但是在主服务器上的索引编制过程中,写入性能下降得令人无法接受。仍在寻找一种通过节流进行索引的方法。

于 2011-05-18T21:30:39.290 回答
1

这不是您正在寻找的确切解决方案,但您可以将第二个 mysqld 实例作为该单个盒子上的从属实例,并SELECT根据需要将查询重定向到它。MySQL Proxy可以帮助您在不重写客户端应用程序的情况下完成此任务。

您还可以从FriendFeed 使用 MySQL中收集一些想法。它们将实际索引存储在其他表中并用于搜索。如果您将数据副本存储在其他表中,甚至在其他服务器上并在那里运行索引,您将能够尽快全速访问主数据,并在以后使用其他服务器获得更快的查询。

这就像您在从属服务器上添加索引以进行搜索类型查询,并在主服务器上仅运行主键查找。

于 2011-06-20T07:10:01.050 回答
1

一个很好的解决方案是执行滚动更新的脚本。您将以非复制方式将索引应用于每个从站。粗略的说明:

for host in $hosts
do
    mysql -h $host -e "STOP SLAVE;\
      SET sql_log_bin=0;\
      FLUSH TABLE t;\
      ALTER TABLE t ADD INDEX a (b,c);\
      SET sql_log_bin=1;\
      START SLAVE;"
done

通过关闭复制,应减少磁盘活动量并提高索引操作的速度。如果您对从属服务器有数据库延迟要求,您可能希望完全解除从属服务器的池化,并包括在从属服务器恢复零秒延迟时重新池化该从属服务器的逻辑。

于 2011-06-20T23:34:01.090 回答
0

您可以在插入时禁用任何非唯一索引,并在完成后重新启用它们。看看禁用键/启用键。但它仅适用于非唯一索引。

如果您使用多值插入语句(插入表(...)值(...),(...),(...)...

顺便说一句,load data infile似乎是在mysql中插入大量数据的最快方法。

于 2011-06-19T17:19:11.097 回答
0

您是否尝试过提高导入的索引设置?这可以显着提高导入性能。sort_buffer_size 适用于任何表类型,myisam_sort_buffer_size 适用于 MyISAM 表。innodb_buffer_pool_size 是 Innodb 的“密钥缓存”。根据您的表格类型,为导入添加这些内容。您要做的是在创建索引期间避免文件排序。

您可以将导入/索引时间缩短到 10-15 分钟或更短。它不是节流,但会显着缩短影响期。

或者,如果您使用的是 MyISAM 表,也许可以选择 MERGE 表?创建一个新表,执行导入,然后将新表添加到 MERGE 表中。导入期间不会对数据库产生影响。除了执行任务的服务器。

于 2011-06-23T05:03:52.650 回答
0

一个以前没有尝试过的想法也不是关于索引限制,如果你制作一个备份表并用你提到的方式更新它有更短的时间跨度,而不是转换/重命名表。我鼓励写下我的想法,因为你需要知道一种方法。

于 2011-06-18T18:10:34.487 回答