评级地点

时间:2010-05-28 14:49:24

标签: mysql load innodb rating

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

Assign places in the rating (MySQL, PHP)

但是我的数据库是高负载的。

我尝试不创建表,但使用MEMORY TABLE并使用以下SQL查询更新它

插入tops(uid)通过exp desc从用户订单中选择uid;

但得到以下MySQL错误

尝试锁定时发现死锁;尝试重新启动交易

因为在执行SQL select之前查询太多。

如何解决这个问题?

P.S。 CREATE TABLE tops as SELECT 工作几乎没有,除了高服务器负载...最高负载平均值:50如果tops是非内存表。

我的桌面用户有近450万行。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:0)

  1. 需要注意的是,MEMORY表像MYISAM一样处理表锁定(它们都执行全表锁)。
  2. 450万行是很多插入来做一个选择。我认为一个好的方法是编写一个脚本,以块的形式提取用户表数据并进行批量插入。

答案 1 :(得分:0)

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

InnoDB支持行级锁定 MVCC (多版本并发控制),我认为这就是您所需要的。 MemoryMyISAM会更快(插入/更新时),但如果您经常遇到死锁,那么InnoDB就可以了。

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