首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法限制Mysql表的索引,这样整体性能就不会受到影响?

有没有办法限制Mysql表的索引,这样整体性能就不会受到影响?
EN

Stack Overflow用户
提问于 2011-05-10 08:28:47
回答 6查看 1.3K关注 0票数 17

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

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

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

问题是,在索引新导入的数据时,数据库的响应性对造成了很大的影响。有没有办法让索引在“低优先级”下运行,这样其他查询仍然可以获得95-100%的速度,并且索引在后台运行?

我使用的是Amazon RDS,所以我不能选择在不同的服务器上加载,然后复制表文件。

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

EN

回答 6

Stack Overflow用户

发布于 2011-05-19 05:30:39

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

我写了一个名为CautiousIndexer的类。

  1. 首先,我存储了create table语句,以重新创建不带索引的表结构。我存储了一个读从数据库数组,循环访问它们,将包含未索引数据的表重命名为prevent_indexing_($name)
  2. 然后,我只在从服务器上运行了create table语句。这有效地将数据移出了将在主服务器上发生的索引语句的方式。
  3. ,然后我对主节点运行了索引查询。由于新创建的表为空,因此在主服务器进行索引时,读从服务器不会对性能产生任何影响。
  4. 当主服务器完成索引时,我从生产循环中取出1个从机,删除空表,将整个表移回原位,然后在非生产从机上索引该表。
  5. 完成后,我将其放回生产环境中,并在剩余的从机上重复从机索引过程。
  6. 当所有从机都建立了索引后,我将表投入生产。

这在效率方面仍然很好,但是在主服务器上的索引期间,写性能变得不可接受地变慢了。仍在寻找一种使用节流进行索引的方法。

票数 4
EN

Stack Overflow用户

发布于 2011-06-20 15:10:01

这并不是您正在寻找的确切解决方案,但是您可以在这个单独的盒子上构建a second mysqld instance as a slave,并根据需要将SELECT查询重定向到它。有MySQL Proxy可以帮助你在不重写客户端应用的情况下实现这一点。

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

这就像在从服务器上为搜索类型的查询添加索引,而只在主服务器上运行主键查找一样。

票数 1
EN

Stack Overflow用户

发布于 2011-06-21 07:34:01

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

代码语言:javascript
复制
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

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

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

https://stackoverflow.com/questions/5943917

复制
相关文章

相似问题

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