处理大规模MySQL表?

时间:2012-02-25 18:14:48

标签: php mysql

我刚刚被要求在工作中修复我们的地址DB,因为它非常慢,我不会正常地接近它,因为另一个人照看它但是他现在已经离开我了。

问题是数据库包含5个表,并且在每个表中复制了大量信息,应该有2700万行但是有3000万行,所以重复超过300万行,以及我们的旧IT人员拥有它的方式setup是在有查询时它会搜索所有5个表,并使用php脚本来清除重复的行,因此信息只显示一次。这大大减慢了我们的服务器速度,所以我写了一个PHP脚本,让每一行与一千万其他人进行比较,如果有重复删除它,但是我启动它后2分钟服务器崩溃所以我试过使用php的一些其他脚本但是每当我尝试运行复杂的mysql查询时服务器崩溃。

是否有一种简单的方法可以使服务器崩溃以合并所有表并删除所有重复的条目?

数据库副本

post1           10,044,279   MyISAM    latin1_german2_ci   758.1 MiB   -
post2            8,328,333   MyISAM    latin1_german2_ci   624.7 MiB   -
postcode         9,344,317   MyISAM    latin1_german2_ci   703.8 MiB   -
postcode_nw      1,157,217   InnoDB    utf8_unicode_ci      97.6 MiB   -
postcode_tmp     1,749,650   MyISAM    latin1_german2_ci    50.5 MiB   -

2 个答案:

答案 0 :(得分:0)

PHP开发人员的一个常见问题是他们忘记了计算机中存在内存等问题 它闻到了#34;好像你试图将所有东西都加载到内存中 你的方法实际上是正确的,它将非常缓慢,但安全。 如果您正确实施。
你不关心速度,因为它是一次性的事情。

  1. 以处理小批量数据的方式设计代码
  2. 自己手动清理(在需要的地方指定null,使GC工作,等到GC在每次迭代之间完成它)。
  3. 考虑将其作为SP使用,并在SP中使用光标(谷歌)。
  4. 在您清理数据之后,我建议您分析数据库结构并将其迁移到更健壮的结构(即将其标准化)。
  5. 考虑存储一些数据的其他方法,没有什么错误的例子将大文本存储为文件,并且只在DB中指向它们。如果这些文本需要可搜索(即全文),MySql不是最好的工具(例如Google SOLR)。
  6. 哦...... InnoDB比旧的,几乎没有开发的MyIssam
  7. 更好

答案 1 :(得分:0)

我认为我不能给出明确答案,但我可以给你一些建议:

  1. 服务器可能崩溃,因为内存不足。向其添加内存或者可能将数据库上载到具有更大内存的临时AWS服务器以运行复杂查询可能会有所帮助。

  2. 您可以考虑使用简单查询来获取数据并在远程计算机上进行比较,而不是让服务器执行繁重的工作。这将需要更长的时间,但最终将完成工作。

  3. 也许您可以更改旧的PHP脚本,清除重复项并删除重复项而不是仅显示它们。不会通过所有数据,但它最终会减少重复。然后可以修改这种方法,以便通过循环通过所有数据调用这个较旧的PHP脚本,这样它将捕获未被正常操作清理代码捕获的重复项。

相关问题