我的应用程序几乎可以连续插入或更新数据。由于多个请求是异步处理的,我编写了如下所示的查询。我使用了一个基于SO的例子,但这不是我实际上做的。
DECLARE @rows int;
INSERT INTO [user] ([username],[reputation])
SELECT [username],[reputation]
FROM (
SELECT [username]=:user,[reputation]=:rep
) A
WHERE A.[username] NOT IN (
SELECT [username]
FROM [user]
);
SET @rows = @@ROWCOUNT;
IF (@rows=0) BEGIN
UPDATE [user]
SET [reputation]=:rep, [updated]=GetDate()
WHERE [username]=:user
END;
使用PHP
PDO
将此内容传递给数据库。由于数据量和其他处理因素,它正在运行的(廉价)VPS上很重要。如果这些流程运行缓慢或延迟,这不是一个真正的问题,但另一方面,这些数据应该可以通过网站获得,然后对数据的查询应该很快。
我在考虑将部分已处理数据复制到第二台服务器并在该数据库上运行网站。但我想知道如何实际使用上面的查询。
我猜测UPDATE
查询只会在@rows=0
时出现在事务日志中,所以这不会有问题。
但是,第一部分只会使用INSERT INTO [user] ([username],[reputation]) VALUES ('Hugo Delsing', '10k')
查询发送WHERE NOT IN ()
或整个查询吗?
大多数时候用户都会存在,所以如果它只运行那些不会有问题的新插件。但是如果每次收益都很小就会运行整个查询。
显然,我可以将第一部分包装在另一个检查if exists(select 1 from [user] where [username] = :user)
中,以确保它只在没有用户的情况下运行,但我想知道是否有必要。
奖金问题,但可以随意忽略,因为它有点宽泛:复制是要走的路还是MS SQL
为这样的事情提供其他/更好的解决方案?