8

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

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

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

4

2 回答 2

2

由于您可能只会为客户明确支付给您存储的信息计费,因此只需总结他们明确提供给您的字段的长度。(省略内部字段,如business_idservice_level_idpermissions或其他。)然后,参考存储要求并计算。

因此,其中 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(*)他们的行并稍微修剪一下以解决您的开销。

于 2013-05-13T19:45:26.310 回答
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;
于 2013-06-05T13:25:04.290 回答