有没有办法限制Mysql表的索引,以便整体性能不受影响?

Zak*_*Zak 17 mysql indexing throttling

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

每个文件需要上传15个文件并插入表格中.每个约500 Mb.

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

问题是,数据库响应能力在索引新导入的数据时受到重创.有没有办法让索引运行在"低优先级",以便其他查询仍然可以获得95-100%的速度和背景中的索引类型的突变?

我正在使用Amazon RDS,所以我没有选择只在另一台服务器上加载然后复制表文件.

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

Zak*_*Zak 4

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

我写了一个名为 的类CautiousIndexer

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

就效率而言,这仍然很好,但在主服务器上建立索引期间,写入性能下降得令人无法接受。仍在寻找一种通过节流进行索引的方法。