php - 处理海量 MySQL 表?

标签 php mysql

我刚刚被要求修复我们工作中的地址数据库,因为它非常慢,我通常不会靠近它,因为另一个人在看管它,但他现在已经离开了,所以这取决于我。

问题是数据库包含 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 开发人员的一个常见问题是他们忘记了计算机中存在内存这样的东西。
它“闻起来”好像你试图将所有内容加载到内存中。
你的方法实际上是正确的,它会很慢,但安全。 如果您正确实现它。
您不关心速度,因为这是一次性的事情。

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

关于php - 处理海量 MySQL 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446660/

相关文章:

PHP - 在浏览器下载之前在服务器中调整图像大小

php - 如何获取mysql中具有相同值的记录数最多的值

javascript - 如何根据下拉菜单选择使用数据库中的数据自动填充表单

php - 如何捕获并记录生产网站中的每个 PHP 和 JS 错误?

PHP并行或串行进程执行?

php - Google Analytics Pro 可以提供视频特定数据吗?

mysql - 从电子表格在 mysql 中创建 sql 表(如 oracle 应用程序生成器)

mysql - ROR 中的数据库安全并发

mysql - 在没有密码的情况下输入 mysql 应该不起作用

php - 根据外键编辑计划