Mysql 维护排名表的最佳实践?

Mysql 维护排名表的最佳实践?,mysql,ranking,insert-update,Mysql,Ranking,Insert Update,使用MySQL和PHP,我有一个简单的排名表,有两列user和score 每周一次,我重新运行排名脚本,它计算每个用户的分数 许多用户有了新的分数 有些则不然 有时会有新用户添加到表中 用MySQL实现这一点的最佳方法是什么?如果需要添加新行,update是否有效?insert是否会覆盖现有行,这样我就可以再次插入整个表?是否最好干脆放下表格,从头开始重新编写 **Sample Data** User01 2500 User02 3000 User03 100 **New

使用MySQL和PHP,我有一个简单的排名表,有两列
user
score

每周一次,我重新运行排名脚本,它计算每个用户的分数

  • 许多用户有了新的分数
  • 有些则不然
  • 有时会有新用户添加到表中
用MySQL实现这一点的最佳方法是什么?如果需要添加新行,
update
是否有效?
insert
是否会覆盖现有行,这样我就可以再次插入整个表?是否最好干脆放下表格,从头开始重新编写

**Sample Data**

User01   2500
User02   3000
User03    100

**New Data to be Added**

User01   2700
User02   4000
User04   1000 // new account

除非有数千个用户……

插入不会覆盖现有行,而是会产生错误(例如,如果您将用户列标记为唯一,并尝试添加现有用户)。类似地,UPDATE不会插入新行,只会更改现有行

如果大多数用户需要更新,并且存在应删除的用户,即不再包含在新的分数表中,则删除和重写整个表似乎是一个可接受的解决方案

否则,我将更新该表:

便携式解决方案是检查表中是否已包含密钥(即用户)(通过SELECT),然后对不存在的密钥使用INSERT或对已存在的密钥使用UPDATE。当然,如果出现违反约束的错误,您也可以尝试插入并检查错误代码,然后返回更新

在MySQL上,您还可以使用以下语法,只需一个查询即可完成操作:

INSERT INTO ... ON DUPLICATE KEY UPDATE score = ...

但是,这是不可移植的,不能与其他RDBMS一起使用,只能与MySQL一起使用。

INSERT不会覆盖现有行,而是会产生错误(例如,如果您将用户列标记为唯一,并尝试添加已存在的用户)。类似地,UPDATE不会插入新行,只会更改现有行

如果大多数用户需要更新,并且存在应删除的用户,即不再包含在新的分数表中,则删除和重写整个表似乎是一个可接受的解决方案

否则,我将更新该表:

便携式解决方案是检查表中是否已包含密钥(即用户)(通过SELECT),然后对不存在的密钥使用INSERT或对已存在的密钥使用UPDATE。当然,如果出现违反约束的错误,您也可以尝试插入并检查错误代码,然后返回更新

在MySQL上,您还可以使用以下语法,只需一个查询即可完成操作:

INSERT INTO ... ON DUPLICATE KEY UPDATE score = ...
但是,这是不可移植的,不能用于其他RDBMS,只能用于MySQL

更新或插入

我认为INSERT会比更新好。对于insert,添加一个查询。其中,对于更新,您必须为每个用户运行2个查询。首先选择用户,然后根据用户ID进行更新

所以最快的是insert,您可以随时使用sql查询对其求和。

正如您提到的双向查询

更新或插入

我认为INSERT会比更新好。对于insert,添加一个查询。其中,对于更新,您必须为每个用户运行2个查询。首先选择用户,然后根据用户ID进行更新


所以最快的是insert,您可以随时使用sql查询对其求和。

代码>替换。。。INTO语法将在需要时插入新行,并删除+插入现有行:

# deletes existing and inserts new row:
REPLACE INTO users SET score = 2000, username = 'User01';
# deletes existing and inserts new row
REPLACE INTO users SET score = 3000, username = 'User02';
# inserts new row
REPLACE INTO users SET score = 4000, username = 'User04';  

不过,我最喜欢的方法是在重复键上使用
语法,这主要是因为我一直认为删除一行然后重新插入它比只更新现有行要“昂贵”。假设
用户名
字段是
唯一的
主键
索引,则可以执行以下操作:

# Updates existing User01 row
INSERT INTO users SET score = 2000, username = 'User01' ON DUPLICATE KEY UPDATE score = 2000;
# Updates existing User02 row
INSERT INTO users SET score = 3000, username = 'User02' ON DUPLICATE KEY UPDATE score = 2000;
# Inserts new User04 row
INSERT INTO users SET score = 4000, username = 'User04' ON DUPLICATE KEY UPDATE score = 2000;

替换为。。。INTO
语法将在需要时插入新行,并删除+插入现有行:

# deletes existing and inserts new row:
REPLACE INTO users SET score = 2000, username = 'User01';
# deletes existing and inserts new row
REPLACE INTO users SET score = 3000, username = 'User02';
# inserts new row
REPLACE INTO users SET score = 4000, username = 'User04';  

不过,我最喜欢的方法是在重复键上使用
语法,这主要是因为我一直认为删除一行然后重新插入它比只更新现有行要“昂贵”。假设
用户名
字段是
唯一的
主键
索引,则可以执行以下操作:

# Updates existing User01 row
INSERT INTO users SET score = 2000, username = 'User01' ON DUPLICATE KEY UPDATE score = 2000;
# Updates existing User02 row
INSERT INTO users SET score = 3000, username = 'User02' ON DUPLICATE KEY UPDATE score = 2000;
# Inserts new User04 row
INSERT INTO users SET score = 4000, username = 'User04' ON DUPLICATE KEY UPDATE score = 2000;

请添加一些示例数据,您拥有什么和想要什么?请添加一些示例数据,您拥有什么和想要什么?