如何在SQL查询中获取结果集的字节大小?

28

在MySQL中,是否有可能获取SQL查询结果的字节大小?

比如:

select * from sometable;

这个查询返回了10000行数据。我不想要这些行,而是想知道结果集的大小(以字节为单位)。这是否可能实现?


只是好奇,你为什么需要这个? - zerkms
为了在后台进程中找出要获取和处理的行数。我处于内存有限的环境中,获取太多的行将会导致进程崩溃。我正在尝试尽可能多地处理行,以符合内存限制。 - Raj
数据大小的信息能给你什么帮助呢?如果你的内存足够大,那就没问题,但如果不够大,你将无法得到有关数据大小的结果。你无法预测返回的数据大小。 - zerkms
我们需要对结果集中所有行进行字节精确计数,因为我们根据客户存储的数据量来计费。由于各种原因,近似值是不够的。如果我们能直接使用MySQL函数/存储过程来完成这个任务就太好了。 - Mike Gleason
4个回答

26
select sum(row_size) 
from (
  select 
    char_length(column1)+
    char_length(column2)+
    char_length(column3)+
    char_length(column4) ... <-- repeat for all columns
  as row_size 
  from your_table
) as tbl1;

enumsetchar_length可能不准确,请注意。


你提到了enumset不准确,那其他类型呢?例如,int可以表示为长度从1到10不等的字符串,但在MySQL中它始终占用4个字节。此外,根据这个论点,可以假设对于足够大的数据集,char_length总是会高估总大小吗? - iloo
注意:如果您的任何列为空,则结果将为NULL。考虑仅对您知道具有长度的列求和,或使用if/else将空列替换为零,以避免任何NULL值。 - Matthew

15
为了在 Angelin 的解决方案上进行改进,如果您的数据包含空值,您需要在每个列中添加 IFNULL:
select sum(
    ifnull(char_length(column1), 0) +
    ifnull(char_length(column2), 0) +
    ifnull(char_length(column3), 0) +
    ifnull(char_length(column4), 0) ... <-- repeat for all columns
)
from your_table

11

简化:

select sum(char_length(column1)+
    char_length(column2)+
    char_length(column3)+
    char_length(column4) ... )<-- repeat for all columns
   from your_table

正如@futilerebel所提到的那样,您需要对每个列添加IFNULL()函数


9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接