mySQL 临时表已满

标签 mysql global-temp-tables

我正在尝试使用以下语法创建临时 mySQL 表并将其加载到内存中,但遇到“表已满”错误:

CREATE TEMPORARY TABLE IF NOT EXISTS tmpHistory ENGINE=MEMORY SELECT * FROM history ORDER BY date ASC;

我的原始历史记录 InnoDB 表有大约 300 万行和大约 300mb。我增加了以下两个服务器变量的默认值 16mb:

最大堆表大小 = 536870912

tmp_table_size = 536870912

我在 AWS r3.xlarge 上运行 mySQL,这是一个具有 30.5GB RAM 的 4 核机器。

我已经查看了 this SO guidance,但仍然遇到 Table is Full 错误。我刚开始使用内存引擎,因此欢迎任何建议。

最佳答案

max_heap_table_size,而不是 tmp_table_size 控制任何后续 MEMORY 表的最大大小。

MEMORY 有几个怪癖。也许这让您有点不适应:VARCHARs 被转换为 CHARs。因此,如果 CHARACTER SET utf8VARCHAR(255) 每行占用 765 个字节。

为什么要把一个完美的InnoDB表复制到一个MEMORY表中?为了避免磁盘命中?不...如果 innodb_buffer_pool_size 足够大,InnoDB 表将有效地存在于 RAM 中。加快速度?不一定,因为InnoDB有行锁,而MEMORY只有表锁。

请提供SHOW CREATE TABLE;可能还有其他事情可以反驳您正在做的事情和/或解释为什么会出现错误。

关于mySQL 临时表已满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831067/

相关文章:

mysql - 网络解决方案 MySQL 设置与 Go Daddy MySQL 设置

MySQL LIKE %string% 不够宽容。还有什么我可以用的吗?

sql服务器: index already existing on global temp table

sql - 使用 SQL Server 临时表的最佳实践

global - Firebird 全局临时表(GTT),触摸其他表?

c++ - 未加载 QMYSQL 驱动程序,已尝试所有提示

mysql - SQL 查询拒绝关注顺序子句

php - 只获取倒数第二条记录 - mysql-query

c# - 如何查看由sql server中的代码创建的临时表?