2

我正在尝试使用以下收据生成评分位置表

在评级中分配位置(MySQL、PHP)

但我的数据库负载很高。

我尝试不创建表,而是使用 MEMORY TABLE 并使用以下 SQL 查询对其进行更新

insert into tops (uid) select uid from users order by exp desc;

但得到以下 MySQL 错误

尝试获取锁时发现死锁;尝试重启事务

因为在执行 SQL 选择之前有太多的查询。

如何解决这个问题呢?

PS CREATE TABLE tops as SELECT几乎可以正常工作,除了高服务器负载...高达平均负载:如果 tops 是非内存表,则为 50。

我的表用户有近 450 万行。

感谢您的任何建议。

4

2 回答 2

0

InnoDB如果需要高并发,可以使用内存表代替。

InnoDB支持行级锁定MVCC(多版本并发控制),我认为这是您需要的。Memory并且MyISAM会更快(插入/更新时),但如果您经常遇到死锁,那么InnoDB将是要走的路。

如果 InnoDB 在高负载期间给您带来性能问题,很可能是由于索引碎片和页面拆分过多。您可以通过定期执行此操作来解决此问题,ALTER TABLE innodb_tbl_name ENGINE=InnoDB这将重建表并因此重建索引以获得最佳性能。

于 2011-07-22T02:57:06.157 回答
0
  1. 需要注意的是,MEMORY 表像 MISAM 一样处理表锁定(它们都做全表锁定)。

450 万行是一个选择的大量插入操作。我认为一个好的方法是编写一个脚本,将用户表数据分块下拉并进行批量插入。

于 2011-07-22T02:33:41.770 回答