我需要将一个大型数据集加载到生产数据库中。
每个15文件都需要上传到并插入到一个表中。每个约为500Mb。
我有两个ID列需要编制索引。如果我加载带有索引的文件,上传大约需要3个小时。如果我删除索引,加载数据本地infile,然后重新添加索引,整个操作大约需要30分钟。
问题是,在索引新导入的数据时,数据库的响应性对造成了很大的影响。有没有办法让索引在“低优先级”下运行,这样其他查询仍然可以获得95-100%的速度,并且索引在后台运行?
我使用的是Amazon RDS,所以我不能选择在不同的服务器上加载,然后复制表文件。
添加一个赏金,因为我仍然想看看是否有一种方法可以在索引特定的框时获得良好的性能。
发布于 2011-05-19 05:30:39
好吧,我从来没有找到一个节流的方法,但我确实找到了一个方法来缓解我的问题。这个解决方案对我的问题来说是独一无二的,但我会把它贴出来,以防其他人发现它有用。
我写了一个名为CautiousIndexer
的类。
prevent_indexing_($name)
。这在效率方面仍然很好,但是在主服务器上的索引期间,写性能变得不可接受地变慢了。仍在寻找一种使用节流进行索引的方法。
发布于 2011-06-20 15:10:01
这并不是您正在寻找的确切解决方案,但是您可以在这个单独的盒子上构建a second mysqld instance as a slave,并根据需要将SELECT
查询重定向到它。有MySQL Proxy可以帮助你在不重写客户端应用的情况下实现这一点。
您还可以从FriendFeed usage of MySQL收集一些想法。它们将实际的索引存储在其他表中,并使用它们进行搜索。如果您将数据副本存储在其他表中,甚至存储在其他服务器上,并在那里运行索引,您将能够以最快速度访问主数据,并在以后使用其他服务器获得更快的查询。
这就像在从服务器上为搜索类型的查询添加索引,而只在主服务器上运行主键查找一样。
发布于 2011-06-21 07:34:01
一个很好的解决方案是使用一个执行滚动更新的脚本。您将以非复制的方式将索引应用于每个从属服务器。下面是一个粗略的说明:
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
通过关闭复制,应减少磁盘活动量并提高索引操作的速度。如果您对从服务器有数据库延迟要求,那么您可能希望完全解除从服务器的池,并在从服务器恢复零秒延迟时包含重新池化从服务器的逻辑。
https://stackoverflow.com/questions/5943917
复制相似问题