【发布时间】:2017-07-21 17:59:45
【问题描述】:
- 在 Mysql(5.7 及更高版本)中用于对表进行更改跟踪,this approach 实现起来非常简单。
- 但它需要版本表是 MyISAM,它执行表级锁定。
- 这种方法是否适用于每秒发生多次插入/更新的生产系统?
- 有人对这种方法有实际的生产系统经验吗?
数据库中的每个表(InnoDB)都有版本表(MyISAM)
我的系统有以下负载。
* 由于各种连接,每个表的读取速度约为 500 次/秒。
* 并且 50 次写入/秒对触发版本表的各种表。
版本表 (MyISAM) 会成为性能瓶颈吗?
【问题讨论】:
-
我对这种高性能 MyISAM 场景没有直接经验,但是......我认为 MyISAM 会没问题提供你设置你的表和服务器适当地。我说的是使用静态字段、适当的索引,您甚至可以为需要这种性能的任务使用专用服务器,我认为 MyISAM 会做得很好。您还可以在 SSD 而不是硬盘驱动器上设置数据库。
-
这里使用 MyISAM 的唯一原因是获得增量。因此,您获得的是不使用 InnoDB 查找方法的时间(状态表/列或简单地使用例如时间戳而不是增量)。你会失去什么:它不会在 MySQL 8 中工作(不再有 MyISAM)。每当 InnoDB 事务回滚时,您将拥有无效的版本条目(因为它不能在 MyISAM 中回滚)。另一方面,性能应该不是问题,如果是,您可以对其进行分片,例如将奇数/偶数 id 的版本放在表/服务器 1/2 中。无论如何,我的观点是:MyISAM 已经死了。让它安息吧。
-
MyISAM 存储引擎将执行全表锁定。不能同时对表进行读取和写入,所有其他想要访问此特定表的会话必须等到更新完成。 InnoDB 肯定会解决这个问题。对于有大量写入的生产系统,您将不得不尝试关闭 query_cache。太大的查询缓存大小会导致性能显着下降。由于缓存开销和锁定。可缓存查询在 MySQL 的查询缓存上取得排他锁。
标签: mysql database-performance production-environment myisam