我刚刚被要求修复我们工作中的地址数据库,因为它非常慢,我通常不会靠近它,因为另一个人在看管它,但他现在已经离开了,所以这取决于我。
问题是数据库包含 5 个表,每个表中都复制了很多信息,应该有 2700 万行,但是有 3000 万行,所以有超过 300 万行重复,我们的老 IT 人员的方式设置是当有查询时它会搜索所有 5 个表,他使用 php 脚本清除重复的行,因此信息只显示一次。这大大减慢了我们的服务器速度,所以我写了一个 php 脚本来获取每一行并将其与其他 3000 万行进行比较,如果有重复项则删除它,但是在我启动它 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 -
最佳答案
PHP 开发人员的一个常见问题是他们忘记了计算机中存在内存这样的东西。
它“闻起来”好像你试图将所有内容加载到内存中。
你的方法实际上是正确的,它会很慢,但安全。 如果您正确实现它。
您不关心速度,因为这是一次性的事情。
- 以处理小批量数据的方式设计代码
- 自己手动清理(在需要的地方分配 null,让 GC 工作,等到 GC 在每次迭代之间完成填充)。
- 考虑将其作为 SP,并在 SP 中使用光标(谷歌搜索)。
- 清理数据后,我建议分析您的数据库结构并将其迁移到更稳健的结构(即规范化)。
- 考虑存储一些数据的其他方法,例如将大量文本存储为文件并在数据库中仅指向它们的指针没有错。如果这些文本需要可搜索(即全文之类的东西),MySql 不是最好的工具(例如 Google SOLR)。
- 哦...InnoDB 比旧的和几乎不再开发的 MyIssam 更好
关于php - 处理海量 MySQL 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446660/