AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 9679
Accepted
AliBZ
AliBZ
Asked: 2011-12-24 11:44:11 +0800 CST2011-12-24 11:44:11 +0800 CST 2011-12-24 11:44:11 +0800 CST

更新大表

  • 772

我有这两张表:

user_profile:
user_profile_id_int int primary key 
user_profile_id varchar

user_activity:
user_profile_id_int int key
user_profile_id varchar

user_profile 中的两个字段都可以,但我没有来自 user_activity 的 user_profile_id_int,我想使用我在 user_profile 中的地图更新它。我写了一个这样的查询:

update user_activity a
set user_profile_id_int =
(select user_profile_id_int from user_profile b
where a.user_profile_id = b.user_profile_id);

它在一个非常强大的服务器上运行了 1 天,我停止了它。但要记录已更新。

所以这里有两个问题:

  1. 有没有更好更快的方法来做到这一点?
  2. 这种方式可以吗?
mysql performance
  • 2 2 个回答
  • 1843 Views

2 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-12-24T12:18:48+08:002011-12-24T12:18:48+08:00

    回答问题 1

    这应该为你做

    UPDATE user_activity a
    INNER JOIN user_profile b 
    USING (user_profile_id)
    SET a.user_profile_id_int = b.user_profile_id_int;
    

    这将在 MySQL 中工作。如果您不习惯 JOIN 语法,请执行以下操作:

    UPDATE user_activity a
    INNER JOIN user_profile b 
    ON a.user_profile_id = b.user_profile_id
    SET a.user_profile_id_int = b.user_profile_id_int;
    

    两者都应该工作。

    回答问题 2

    从理论上讲,您的查询有效。但是,看看它在做什么:

    对 进行表扫描,使用 的 PRIMARY KEY 进行user_activity索引查找,以及对 中的当前行进行就地更新。user_profile_id_intuser_profileuser_activity

    该查询在每行的基础上来回访问两个表和两个主键。所有的步骤都互相减慢。因此,您会得到一个运行时间更长的查询。

    警告

    添加复合索引user_profile应该可以加快速度:

    ALTER TABLE user_profile ADD INDEX (user_profile_id,user_profile_id_int);
    
    • 2
  2. a1ex07
    2011-12-24T12:28:24+08:002011-12-24T12:28:24+08:00

    我认为您可以尝试添加LIMIT到更新中(并进行一些修改WHERE以过滤掉已更改的记录)。例如,如果您这样做,LIMIT 100则不需要 1 天。当然,如果要更改所有记录,则必须编写一个脚本,该脚本将一直执行UPDATE到更新的行数为 0,但不会阻塞整个表。

    • 1

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve