0

创建临时表时,我没有一个好的方法来估计它会占用多少空间,所以有时会运行类似的查询

CREATE TEMPORARY TABLE t_temp ENGINE=MEMORY
SELECT t.*
FROM `table_name` t
WHERE t.`column` = 'a';

导致错误“表 't_temp' 已满”。我意识到您可以调整您的 max_heap_table_size 和 tmp_table_size 以允许更大的表,但这不是一个很好的选择,因为这些表可能会变得非常大。

理想情况下,我希望它回退到 MyISAM 表,而不是仅仅出错。有没有办法在查询或服务器设置中指定?还是最好的解决方案真的只是观察错误,然后尝试使用不同的表类型再次运行查询?这是我能想到的唯一解决方案,除了如果有任何疑问就永远不要使用 MEMORY 表,但它似乎浪费了数据库资源并且会产生更多的代码复杂性。

我正在运行 MySQL v5.5.27,如果这会影响答案。

4

2 回答 2

2

内存引擎就是这样:如果你的 RAM 用完了,除非你想像 @eggyal 建议的那样开发自己的存储引擎,否则你就完了。

相对而言,优化您的系统可能有比使用条件内存表更好的方法。如果我是你,我会从你的代码中删除 ENGINE=MEMORY 并继续处理下一个问题。MySQL 在缓存表和使用它与其他存储引擎有效的 RAM 方面非常出色。

于 2013-07-04T01:03:25.613 回答
0

MySQL Cluster 提供与 MEMORY 引擎相同的功能,具有更高的性能水平,并提供 MEMORY 不具备的附加功能:

...用于数据持久性的可选磁盘支持操作。

资料来源:MySQL 5.5 手册。http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html

不确定集群是否可以组合一个临时表。

于 2013-07-04T02:56:45.480 回答