php - 如何清理一个3000万条记录的表

标签 php mysql

我们的数据库中有一个表格可以跟踪用户行为。 基本上,我们会跟踪用户浏览的每个页面。

在表格中我们有以下内容:

id | user_id | user_ip | page | created_on

当用户从 PC 检查网站时,假设他检查了一篇特定文章,系统会在“页面”下保存以下“/article/specific/slug”,但是如果用户从移动版本的它保存的网站“http://m.website.com/article/specific/slug

我们正在寻求改变这一点。

我们在数据库中添加了一个新字段作为枚举 (pc, m) 因此我们希望无论设备如何始终保存在“页面”下“/article/specific/slug”

一个问题是我们现在有 3000 万条过去的记录需要转换。

这意味着我们编写一个查询来检查“http://m.website.com”是否存在更新字段删除“http://m.website.com”并将“设备”字段更新为“m”。

有人可以帮忙吗?

最佳答案

查询:

update visits_table
set
    page=replace(page, 'http://m.website.com', ''),
    device='m'
where
    page like 'http://m.website.com%';

要浏览 3000 万行,您必须...浏览 3000 万行。所以你要么只用上面的查询来做:

  • 当网站停机维护时
  • 当网站流量较低时(例如清晨?)
  • 任何时候你想要,但在完成之前期望对 mysql 有一些压力(这可能需要一段时间)

否则,如果您的 id 是增量的,则可以通过将查询拆分为多个查询来批量更新。例如:

update ... where ... and id between 1 and 1000000;
update ... where ... and id between 1000001 and 2000000;
update ... where ... and id between 2000001 and 3000000;
...

关于php - 如何清理一个3000万条记录的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40945151/

相关文章:

php - 在同一页面上获取 PHP 中 HTML 元素的值?

php - 查看变量是否在数组中

php - SQL 请求取回数据失败

mysql - Laravel Eloquent 如何限制登录用户的访问权限

MySQL 在 Between 语句中使用 max(date)

php - 使用PHP将部分MySQL列数据复制到另一个

php - 来自数据库的页面显示特殊字符,如何解决?

php - 无法插入到我的 MYSQL 表中

mysql - 主键自增

php - 如何在Centos 6.9 上相应地安装正确版本的phpmyadmin?