添加更新 SQL 查询
我有一个每周都会更新的脚本。我的主机发出警告,称我的脚本使服务器超载。我收集到的问题是我使用了太多的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用您的值创建一个分隔文件,并使用相当于 MySQL 的 LOAD数据输入。这将比更新快得多。
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.
您最好的选择是通过您的“某事”字段对这些语句进行批处理:
当然,对您的要求一无所知,可能有更好的解决方案......
Your best bet is to batch these statements by your "something" field:
Of course, knowing nothing about your requirements, there is likely a better solution out there...
它将改善 IO,因为只有一次往返,但数据库“工作量”将是相同的。
It will improve IO since there is only one round trip, but the database "effort" will be the same.
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.