查询 table 只有 4% 的 RDS 实例存储容量时出现一般错误 1114
General error 1114 when querying a table only 4% of the storage capacity in an RDS Instance
尝试在位于 Amazon AWS 实例中的 table 上绘制统计信息时遇到以下问题。
table 由大量姓名、日期和州两个字母代码等组成。日期由 6 位代码表示,其中前四位数字是年份,最后两位数字是月份(是的,我们不关心日期)。
我做了一个查询来检查 table 大小,它 returns: 4097 MB 听起来不错。
但我还需要运行以下查询:
SELECT state_code,COUNT(date_code) as cnt,date_code
FROM mytable
WHERE (date_code > 200801)
GROUP BY date_code,state_code
ORDER BY state_code ASC
基本上我想知道每个州的每个 date_code 有多少行。
我的 RDS 实例是一个 db.m4.large 运行ning MySQL 8.0.23 具有 1000 GiB 的存储空间和最大 2000 GiB
我收到此错误:无法按年份和州获取字节数。原因:Select 失败:SQLSTATE[HY000]:一般错误:1114 table '/rdsdbdata/tmp/#sql7245_5bc3_1' 已满。
现在,这里有一个非常类似的问题:How to solve MySQL “The table is full” error 1114 with Amazon RDS?
不过解决方法是简单地增加存储容量,但是4GB只是存储容量的4%。而且这个table会越来越多。
我该如何解决这个问题?是增加 table size
的唯一答案
仅供参考,这将是一个非常罕见的查询。最坏的情况是一天一次。我需要让它工作,对让它变快没有真正的兴趣。以防万一。
SELECT state_code,
COUNT(*) as cnt, -- assuming `date_code` is never NULL
date_code
FROM mytable
WHERE (date_code > 200801)
GROUP BY state_code, date_code -- note swap
ORDER BY state_code, date_code -- matching GROUP BY
添加INDEX(date_code, state_code)
.
备注:
COUNT(*)
是正常的计数语法; COUNT(x)
在计数之前检查 x
是否为空。
GROUP BY
中的顺序可能不重要,但在 ORDER BY
中很重要。由于您要求在 state_code
之前订购,我更改了 GROUP BY
。然后,...
- 当
GROUP BY
和ORDER BY
相同时,不需要二次排序
- 新索引是“覆盖”的,所以它会扫描其中的索引,而不是扫描更大的数据BTree。
如果“旧”数据永远不会改变,您可以通过构建和维护“摘要”来获得更快的查询 table。更多讨论:http://mysql.rjweb.org/doc.php/summarytables
尝试在位于 Amazon AWS 实例中的 table 上绘制统计信息时遇到以下问题。
table 由大量姓名、日期和州两个字母代码等组成。日期由 6 位代码表示,其中前四位数字是年份,最后两位数字是月份(是的,我们不关心日期)。
我做了一个查询来检查 table 大小,它 returns: 4097 MB 听起来不错。
但我还需要运行以下查询:
SELECT state_code,COUNT(date_code) as cnt,date_code
FROM mytable
WHERE (date_code > 200801)
GROUP BY date_code,state_code
ORDER BY state_code ASC
基本上我想知道每个州的每个 date_code 有多少行。
我的 RDS 实例是一个 db.m4.large 运行ning MySQL 8.0.23 具有 1000 GiB 的存储空间和最大 2000 GiB
我收到此错误:无法按年份和州获取字节数。原因:Select 失败:SQLSTATE[HY000]:一般错误:1114 table '/rdsdbdata/tmp/#sql7245_5bc3_1' 已满。
现在,这里有一个非常类似的问题:How to solve MySQL “The table is full” error 1114 with Amazon RDS?
不过解决方法是简单地增加存储容量,但是4GB只是存储容量的4%。而且这个table会越来越多。
我该如何解决这个问题?是增加 table size
的唯一答案仅供参考,这将是一个非常罕见的查询。最坏的情况是一天一次。我需要让它工作,对让它变快没有真正的兴趣。以防万一。
SELECT state_code,
COUNT(*) as cnt, -- assuming `date_code` is never NULL
date_code
FROM mytable
WHERE (date_code > 200801)
GROUP BY state_code, date_code -- note swap
ORDER BY state_code, date_code -- matching GROUP BY
添加INDEX(date_code, state_code)
.
备注:
COUNT(*)
是正常的计数语法;COUNT(x)
在计数之前检查x
是否为空。GROUP BY
中的顺序可能不重要,但在ORDER BY
中很重要。由于您要求在state_code
之前订购,我更改了GROUP BY
。然后,...- 当
GROUP BY
和ORDER BY
相同时,不需要二次排序 - 新索引是“覆盖”的,所以它会扫描其中的索引,而不是扫描更大的数据BTree。
如果“旧”数据永远不会改变,您可以通过构建和维护“摘要”来获得更快的查询 table。更多讨论:http://mysql.rjweb.org/doc.php/summarytables