添加更新 SQL 查询

发布于 2024-08-05 12:56:22 字数 410 浏览 4 评论 0原文

我有一个每周都会更新的脚本。我的主机发出警告,称我的脚本使服务器超载。我收集到的问题是我使用了太多的 UPDATE 查询(我的 8000 多个用户每人一个)。

我知道这是糟糕的编码。所以现在我需要将所有数据集中到一个 SQL 查询中并一次性更新所有数据。我希望这能解决我的问题。

一个简单的问题。如果我纯粹添加用分号分隔的 UPDATE 查询,如下所示:

UPDATE table SET something=3 WHERE id=8; UPDATE table SET something=6 WHERE id=9;

然后使用一个大的 SQL 代码更新数据库,而不是每次更新都查询数据库,这样会更快,对吗?

这是将 UPDATE 语句“捆绑”在一起的最佳方式吗?这会显着减少服务器负载吗?

I have a script that updates itself every week. I've got a warning from my hosting that I've been overloading the server with the script. The problem, I've gathered is that I use too many UPDATE queries (one for each of my 8000+ users).

It's bad coding, I know. So now I need to lump all the data into one SQL query and update it all at once. I hope that is what will fix my problem.

A quick question. If I add purely add UPDATE queries separated by a semicolon like this:

UPDATE table SET something=3 WHERE id=8; UPDATE table SET something=6 WHERE id=9;

And then update the database with one large SQL code as opposed to querying the database for each update, it will be faster right?

Is this the best way to "bunch" together UPDATE statements? Would this significantly reduce server load?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

安人多梦 2024-08-12 12:56:22

使用您的值创建一个分隔文件,并使用相当于 MySQL 的 LOAD数据输入。这将比更新快得多。

LOAD DATA INFILE '/path/to/myfile'
REPLACE INTO TABLE thetable(field1,field2, field3)
//optional field and line delimiters
;

Make a delimited file with your values and use your equivalent of MySQL's LOAD DATA INFILE. This will be significantly faster than an UPDATE.

LOAD DATA INFILE '/path/to/myfile'
REPLACE INTO TABLE thetable(field1,field2, field3)
//optional field and line delimiters
;
野却迷人 2024-08-12 12:56:22

您最好的选择是通过您的“某事”字段对这些语句进行批处理:

UPDATE table SET something=3 WHERE id IN (2,4,6,8)
UPDATE table SET something=4 WHERE id IN (1,3,5,7)

当然,对您的要求一无所知,可能有更好的解决方案......

Your best bet is to batch these statements by your "something" field:

UPDATE table SET something=3 WHERE id IN (2,4,6,8)
UPDATE table SET something=4 WHERE id IN (1,3,5,7)

Of course, knowing nothing about your requirements, there is likely a better solution out there...

快乐很简单 2024-08-12 12:56:22

它将改善 IO,因为只有一次往返,但数据库“工作量”将是相同的。

It will improve IO since there is only one round trip, but the database "effort" will be the same.

多孤肩上扛 2024-08-12 12:56:22

SQL 的一个奇怪之处是下面的整数表达式
如果 A == B,则 (1 -abs(sign(A - B))) = 1,否则为 0。为了方便起见,我们将此表达式称为 _eq(A,B)。
所以

更新表设置= 3*_eq(id,8) + 6* _eq(id,9)
其中 id 在 (8,9) 中;

将使用单个更新语句执行您想要的操作。

A curiosity of SQL is that the following integer expression
(1 -abs(sign(A - B))) = 1 if A == B and 0 otherwise. For convenience lets call this expression _eq(A,B).
So

update table set something = 3*_eq(id,8) + 6* _eq(id,9)
where id in (8,9);

will do what you want with a single update statement.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文