【问题标题】:Solution for high frequency of Deleting and Inserting records in MySQLMySQL中删除和插入记录频率高的解决方案
【发布时间】:2013-02-01 16:26:37
【问题描述】:

我的程序(游戏服务器)经常从表中删除许多记录,然后也将许多记录插入到表中。 用例是:

  1. 一个角色可能有很多物品,每个物品都有自己的属性。
  2. 角色一旦加载到游戏中,他的物品就会存储在内存中。
  3. 当角色存在游戏时,所有旧记录(角色加载到游戏之前)将被删除,程序会将角色的新项目插入数据库。
  4. 一个角色平均有 100 个项目(100 个项目记录和 100 个其他项目属性记录)

当 CCU 达到 1k 左右时,mysql 控制这些读/写会变得非常慢。

我尝试了很多优化 MySQL 的方法,但都不够好。我的临时解决方法是为 MySQL 数据文件夹使用 SSD 磁盘。

我的问题是:我应该使用其他 DBMS(目前正在考虑使用 MongoDB ...)吗?我应该选择什么?

【问题讨论】:

  • 你是说它加载所有记录,然后删除所有内容,然后重写它(并且有 1000 个用户同时尝试相同的操作)?每次发生这种情况时,每条记录是否都发生了变化?
  • 这是我的假设,但是,当我想断开所有用户与服务器的连接时会发生这种情况...... Engine = MyISAM
  • 经验法则:仅更新已更改的数据。为简化代码而批量更新批量插入通常不是正确的做法。

标签: mysql performance mongodb insert


【解决方案1】:

MySQL 可以处理很多事情,但是频繁使用INSERTUPDATEDELETE 选项的表会导致严重的降级。保持 MySQL 在高负载下运行是可能的,但对于这种情况,您需要分片到不同的表或数据库中。

不过,为 MySQL 使用 SSD 一点也不坏。

如果您可以围绕像 Redis 这样的快速键值存储来构建您的系统,那么如果所有数据都可以放入内存中,那么您可能会获得您想要的所有性能。

【讨论】:

  • 我个人认为Redis不适合这种情况,因为一个item涉及到很多属性,有时我必须搜索那些item(比如搜索ItemID相同的Item)。 ..分片到不同的表或数据库也不是一个好的解决方案(我认为),因为这里的问题是我们在短时间内有很多磁盘访问......不同的表,数据库但相同的磁盘是吧?
  • 是什么阻止你在不同的卷上分片?如果您尝试像使用关系数据库一样使用 Redis,则使用它可能会很棘手,但如果您提前仔细计划,您可以准确地创建所需的索引结构并使用它们进行搜索。
  • 我不会使用很多卷,SSD 确实比那个选项更好。但是,现在想想 Redis,我明白了你的意思,也许我会把 mysql 和 Redis 混为一谈……谢谢你的建议
猜你喜欢
  • 1970-01-01
  • 2017-12-10
  • 2011-12-04
  • 2015-07-05
  • 1970-01-01
  • 2011-11-27
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多