我正在开发一个基于 LAMP 堆栈的项目管理程序。我暂时选择不为每个客户提供自己的数据库,而是将所有业务数据合并到一个大型数据库中。
所有数据库表中的第一列是business_id。此行表示某条数据属于哪个业务,这使我们无法将业务 1 的数据暴露给业务 2。
但是当我试图解决计费问题时,能够每月运行一次 cron 作业以确定每个企业正在使用多少数据库空间将非常有用。所以这是我的问题:有没有办法让 MySQL 返回所有行使用的字节数 WHERE business_id = 'x'?
我正在开发一个基于 LAMP 堆栈的项目管理程序。我暂时选择不为每个客户提供自己的数据库,而是将所有业务数据合并到一个大型数据库中。
所有数据库表中的第一列是business_id。此行表示某条数据属于哪个业务,这使我们无法将业务 1 的数据暴露给业务 2。
但是当我试图解决计费问题时,能够每月运行一次 cron 作业以确定每个企业正在使用多少数据库空间将非常有用。所以这是我的问题:有没有办法让 MySQL 返回所有行使用的字节数 WHERE business_id = 'x'?
由于您可能只会为客户明确支付给您存储的信息计费,因此只需总结他们明确提供给您的字段的长度。(省略内部字段,如business_id
、service_level_id
、permissions
或其他。)然后,参考存储要求并计算。
因此,其中 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(*)
他们的行并稍微修剪一下以解决您的开销。
希望这可以帮助:
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;