【问题标题】:Improve speed or find faster alternative to SQL Update提高速度或找到更快的 SQL 更新替代方案
【发布时间】:2020-06-30 17:24:28
【问题描述】:

我在 MySQL 服务器上有一个 68m 行 x 77 列的表 (general_table),其中包含 user_iduser_namedatemedia_channel

在极少数情况下(其中 83k)存在 user_id 而不是 user_name,我们会发现 user_name 的值是“-”。我可以从users_table 表中获取此信息。

要更新 general_table 上的值,我使用以下更新函数,但考虑到表的大小,它需要很长时间,所以我正在寻找替代方法。

UPDATE 
   general_table as a,
   users_table as b
   SET a.user_name = b.user_name 
   where a.date > '2020-01-01'
   and a.user_id = b.user_id
   and a.media_channel = b.media_channel
   and a.user_name = '-';

也欢迎使用 Pandas、PyMySQL 或 SQLAlchemy 回答

请记住那些请求仅适用于SELECT 查询而不适用于更新的解释函数。

【问题讨论】:

  • 与所有相关表的 SHOW CREATE TABLE 语句一样,关于查询性能的问题总是需要对给定查询的解释
  • 嗨草莓,感谢您的快速输入。问题是它与工作相关,所以我真的不能包含比我已经拥有的更多的信息,我会尝试创建一个类似的表并添加这些。
  • 那你来错地方了,我的朋友。
  • 只是在寻找关于替代方案或细节的高级想法,可以使其更快,希望我们也可以帮助工作社区解决明显的限制。

标签: python mysql sql pandas sqlalchemy


【解决方案1】:

对于这个查询:

UPDATE general_table g
JOIN users_table u ON g.user_id = u.user_id AND g.media_channel = u.media_channel
SET g.user_name = u.user_name 
WHERE g.date > '2020-01-01' AND g.user_name = '-'

您希望在general_table(user_name, date, user_id, media_channel)users_table(user_id, media_channel, user_name) 上建立索引。

注意:更新 83k 行仍需要一些时间,因此您可能希望分批执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2018-12-11
    • 2012-07-05
    • 2012-01-23
    相关资源
    最近更新 更多