我正在使用 mysql 内存表作为缓存多次读取的数据行的一种方式。我选择了这个替代方案,因为我无法在我的解决方案中使用 xcache 或 memcache。在阅读了有关此主题的mysql 手册和论坛后,我得出的结论是,当表达到其最大内存大小时会引发错误。我想知道是否有办法捕获此错误以截断表并释放内存。我不想提高可以使用的内存限制,我需要一种自动释放内存的方法,以便表可以继续工作。
谢谢。
我正在使用 mysql 内存表作为缓存多次读取的数据行的一种方式。我选择了这个替代方案,因为我无法在我的解决方案中使用 xcache 或 memcache。在阅读了有关此主题的mysql 手册和论坛后,我得出的结论是,当表达到其最大内存大小时会引发错误。我想知道是否有办法捕获此错误以截断表并释放内存。我不想提高可以使用的内存限制,我需要一种自动释放内存的方法,以便表可以继续工作。
谢谢。
如果内存不足,引擎将引发错误1114
并显示以下错误消息:
The table 'table_name' is full
您应该在客户端捕获此错误并从表中删除一些数据。
您应该改用普通的持久表并依赖固有的缓存。对于可以安全丢弃内容的表,MyISAM 是一个安全引擎(前提是您乐于在每次启动时执行 TRUNCATE TABLE),或者,您可以使用与永久表相同的引擎(例如 InnoDB)。
无论如何,内存表都非常糟糕(在所有已发布的 MySQL 版本中;在 Drizzle 和其他一些版本中更好),因为它们将行填充到最大长度,这意味着您不能真正开始明智地将 VARCHAR 放入其中。
不幸的是,您还不能在每个表(或每个事务)的基础上设置 innodb 持久性参数,因此您必须根据每个服务器决定您需要多少持久性 - 在您的情况下,没有,因此您可以设置 innodb_flush_log_at_trx_commit到 2(甚至 0,但它对你的好处很少)