我已阅读total size of data,determine space of a particular table等,但我想知道,是否有可能找到表中特定用户使用的总空间(例如GMail如何显示您你用过的总空间。)?
假设我有user_id 1谁拥有100条私人消息(不在文件夹中,只在数据库中)和10个文件上传(其位置存储在数据库中)。这些都在3个单独的表中,但它们确实占用了MySQL空间)。是否可以创建一个查询,为该用户提供总共所有空间?
答案 0 :(得分:0)
评论太长了。
答案是“不是真的”。您可以在用户使用的所有表中的所有字段中添加空格。但这真的是用户使用的空间量吗?
考虑一个只有一条记录的表。数据需要在某个地方。在数据库中,记录存储在页面上,典型页面大小为16k。因此,无论一条记录有多大或多小,它都将占据至少16k。您是否将这一切归因于用户?
只考虑记录的大小。有时,整数,浮点数和双精度等字段需要对齐 - 即,从地址空间中的4字节或8字节边界开始。这可能会在记录中留下漏洞。这可归因于用户吗?类似地,varchar()
类型具有用于存储长度的开销,并且可空列具有用于存储NULL
标志的开销。你如何归因于这些?
当您开始添加索引和blob以及文本类型时,情况会变得更加复杂,这会引入包含数据的其他类型的页面。
并且,通常,您可以删除用户使用的所有记录,并且不释放数据库要使用的空闲页面。新记录将进入以前使用的空间,但只有同一个表中的新记录。
答案 1 :(得分:0)
不幸的是,你不能。
以下查询将显示整个yourtable
表占用的空间,但您无法将其过滤到特定的行或条件。这意味着它显示了所有用户占用的空间。
SHOW TABLE STATUS IN your_database LIKE 'yourtable';
gmail向您展示了什么,它的物理空间。电子邮件作为文件存储在服务器上,而不是存储在数据库中。这就是为什么你可以确定它使用了多少空间的原因。
一种困难的方法是为该特定用户创建一个临时表,并使用该用户的确切记录填充它,并使用我上面写的查询,查看该表的整个大小。这将是特定用户占用的总空间量。您感兴趣的价值是data_length
。
无论如何,如果你选择这种方法,请考虑它资源非常昂贵的事实,你应该缓存结果并且不要指望即时获取这些数据(实时)。