MySQL - 更新 - 更快的解决方案?

MySQL - UPDATE - faster solution?

我想加速一些脚本,所以我的问题是:
是否有更快的可用解决方案?

uid 只是添加到临时 table.
的 ID 之后它用给定的 uid 更新原点 table。

引擎为 InnoDB、MariaDB 10.0.19。

约 400 个条目大约需要 20 秒。

CREATE TEMPORARY TABLE cleanup_users AS (
    SELECT uid FROM users
    WHERE FROM_UNIXTIME(last_connect) <= DATE_SUB(NOW(), INTERVAL 2 MONTH)
    AND activity <= 20 AND hide != 1
);
UPDATE users SET hide = 1 WHERE uid IN (
    SELECT * FROM cleanup_users
);
DROP TABLE IF EXISTS cleanup_users;

首先,您不需要创建新的 table

UPDATE users SET hide = 1 WHERE uid IN (
    SELECT uid FROM users
    WHERE FROM_UNIXTIME(last_connect) <= DATE_SUB(NOW(), INTERVAL 2 MONTH)
    AND activity <= 20 AND hide != 1
);

而且,我认为你可以做到这一点。

UPDATE users SET hide = 1 WHERE
      FROM_UNIXTIME(last_connect) <= DATE_SUB(NOW(), INTERVAL 2 MONTH) AND activity <= 20 AND hide != 1
UPDATE users SET hide = 1 WHERE last_connect <= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 2 MONTH)) AND activity <= 20 AND hide != 1

不要在 where 子句中对列使用函数并添加覆盖索引以加快速度。

ALTER TABLE users ADD INDEX(last_connect,activity,hide);

即使您需要更新来自不同 table 的数据匹配,您也不需要临时 table,在当前情况下,只需一个查询即可完成

update users 
set hide = 1 
where
last_connect <= unix_timestamp(DATE_SUB(NOW(), INTERVAL 2 MONTH))
activity <= 20 AND hide != 1

现在假设 table 中涉及大量数据,您需要一些索引,您可以拥有以下覆盖索引

alter table users add index date_act_hide_idx(last_connect,activity,hide);

确保在应用索引之前备份 table。

现在请注意,where 子句发生了变化,删除了 FROM_UNIXTIME 并在比较的右侧使用了 unix_timestamp,迫使它使用列上的索引 last_connect