【问题标题】:mySQL Temporary Table is FullmySQL 临时表已满
【发布时间】:2016-08-18 06:47:30
【问题描述】:

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

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

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

max_heap_table_size = 536870912

tmp_table_size = 536870912

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

我已经查看了this SO guidance,但仍然遇到 Table is Full 错误。我是使用内存引擎的新手,欢迎提出任何建议。

【问题讨论】:

    标签: mysql global-temp-tables


    【解决方案1】:

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

    MEMORY 有几个怪癖。也许这一点你:VARCHARs 变成了CHARs。因此,VARCHAR(255) 如果是 CHARACTER SET utf8,则每行占用 765 个字节。

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

    请提供SHOW CREATE TABLE;可能还有其他事情可以反对您正在做的事情和/或解释您遇到错误的原因。

    【讨论】:

    • 感谢您的评论。我应该提到我的历史表被划分为年份,并且这个临时表正在加载这些年份中的一个以进行只读访问。我每天刷新一次这个临时表。我也很尴尬地承认我试图从 Sequel Pro 运行这个返回错误的语句。从命令行运行成功在内存中创建了临时表。我对这个新临时内存表的查询响应率的初步测试提高了 90%。
    • 每天只重新加载一次?也可以将您应该给 MEMORY 的空间提供给 buffer_pool
    【解决方案2】:

    找出您使用 engine=memory 创建的所有表

    select table_name,
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
    from information_schema.tables 
    where table_schema = 'db1' and engine = 'memory';
    

    使用 top 命令查看哪个进程正在消耗多少内存。如果表非常大,请避免使用内存。想想像 Amazon RedShift 这样的列存储。

    【讨论】:

    • 我所有的表都被列为 InnoDB。
    猜你喜欢
    • 2013-10-18
    • 2021-09-12
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多