MySQL - 如何衡量某些行使用的空间量?

时间:2013-05-13 17:04:13

标签: mysql

我正在开发一个基于LAMP堆栈的项目管理程序。我暂时选择不为每个客户提供他们自己的数据库,而是将所有业务数据合并到一个大型数据库中。

所有数据库表中的第一列是business_id。此行表示某个数据所属的业务,这使我们无法将业务1的数据暴露给业务2。

但是当我试图解决计费问题时,能够每月运行一次cron作业来确定每个企业使用的数据库空间是非常有用的。所以这是我的问题:有没有办法让MySQL返回所有行使用的字节数WHERE business_id ='x'?

2 个答案:

答案 0 :(得分:2)

由于您可能只会对客户明确支付给您存储的信息进行计费,因此只需总结他们明确给您的字段长度。 (省略business_idservice_level_idpermissions等内部字段。)然后,请参阅storage requirements并计算。

因此,其中B是所有数字字段所需的字节数,例如有3个文本字段txtA,txtB和txtC:

select
    business_id,
    count(*) * B +
        sum(length(txtA) + length(txtB) + length(txtC)) as bytes
from table
where business_id={id};

但是,一旦你的系统中有了合理数量的数据,我怀疑查询将会持续很长时间。告诉您的客户您将在他们的“近似”数据存储上对他们进行计费可能更简单。使用他们行的average_row_length * count(*)并稍微修剪一下来计算您的开销。

答案 1 :(得分:0)

希望这会有所帮助:

SELECT
  table_schema, count(*) TABLES,
  concat(round(sum(table_rows)/1000000,2),'M')
  rows,concat(round(sum(data_length)/(1024*1024*1024),2),'G')
  DATA,concat(round(sum(index_length)/(1024*1024*1024),2),'G')
  idx,concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G')
  total_size,round(sum(index_length)/sum(data_length),2) idxfrac
FROM
  information_schema.TABLES group by table_schema;