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
我想加速一些脚本,所以我的问题是:
是否有更快的可用解决方案?
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