是否有一种方法来限制MySQL表的索引,从而使总体性能不受影响?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

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

每个文件需要上传15个文件然后插到桌子上。每一个都是关于500 Mb...

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

问题是数据库响应性受到很大打击。同时索引新导入的数据。是否有办法使索引以“低优先级”运行,以便其他查询仍能以95-100%的速度运行,而索引类型则在后台运行?

我在用亚马逊RDS,所以我没有选择只在不同的服务器上加载,然后复制表文件。

添加一个丰富的这一点,因为我仍然想看看是否有一种方法,以获得良好的性能,同时在一个特定的框索引。

提问于
用户回答回答于

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

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

通过关闭复制,应该减少磁盘活动的数量,并提高索引操作的速度。如果对从站有数据库滞后要求,可能想完全去池从,并包括逻辑重新池当它恢复零秒滞后。

用户回答回答于

嗯,我从来没有找到方法,但我确实想出了一个方法来缓解我的问题。这个解决方案是我的问题特有的,但我会发布它,以防别人发现它有用。

我写了一个叫CautiousIndexer...

  1. 首先,我存储CREATETABLE语句以重新创建没有索引的表结构。我存储了一个读从数据库数组,通过它们将表重命名为prevent_indexing_($name)...
  2. 然后,我只对运行CREATETABLE语句。这有效地将数据移除了将发生在主服务器上的索引语句的方式。
  3. 然后,我对主程序运行索引查询。因为新创建的表是空的,主索引时读从对性能没有影响。
  4. 当主索引完成后,我从生产轮转中取出一个,删除空表,将完整的表移回原处,然后将表索引到退出。
  5. 当它完成后,我将它放回生产中,并对其余的重复了从索引过程。
  6. 当所有的都被编入索引时,我把表投入生产。

这在效率方面仍然不错,但在主服务器索引期间,写性能却慢得令人无法接受。仍然在寻找一种用节流索引的方法。

扫码关注云+社区