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