【问题标题】:How to get size per day of a table如何获取一张桌子每天的大小
【发布时间】:2011-08-29 23:42:24
【问题描述】:

我有一个包含大约 20 个表的数据库。每个表都有一列“dtLogTime”,用于记录插入该行的时间。我想弄清楚每张桌子每天记录的大小(可能是 kb 或 mb)。更具体地说,我只对最近 3 天感兴趣。此外,这些表会在某个时间间隔(即 2 周、1 个月等)内跟踪数据,这意味着我每存储一天的新数据就会丢失一天的数据。

我遇到了这段代码,它可以显示每个表的大小。

<?php

$link = mysql_connect('host', 'username', 'password');

$db_name = "your database name here";
$tables = array();

mysql_select_db($db_name, $link);
$result = mysql_query("SHOW TABLE STATUS");

while($row = mysql_fetch_array($result)) {
    /* We return the size in Kilobytes */
    $total_size = ($row[ "Data_length" ] + 
                   $row[ "Index_length" ]) / 1024;
    $tables[$row['Name']] = sprintf("%.2f", $total_size);
}

print_r($tables);
?>

当我尝试做时

"SHOW TABLE STATUS WHERE dtLogTime < '2011-08-28 00:00:00' 
AND dtLogTime >= '2011-08-27 00:00:00'" 

它给了我一个错误。有没有办法做到这一点?

谢谢

【问题讨论】:

  • 除非您真的想提取所有数据以测量其大小,否则如何每天记录数据库表文件(如果可行,取决于数据库类型)大小。或每天运行表状态并记录
  • 听起来不错,但是每天都会添加新行,那么我该如何记录呢?
  • 为什么这个标签是[sql-server]
  • 我的一位同事建议做(每日行数)/(总行数)* 表的总大小。任何人都同意这一点或有更好的建议。似乎有一些错误就足够了
  • @Mark,您可以使用mysqlshow --status db_name 从命令行执行相同的操作。将其与每天运行的 CRON 作业挂钩。

标签: php mysql sql database


【解决方案1】:

您需要包含LIKE 子句来指定表。来源:http://dev.mysql.com/doc/refman/5.6/en/show-table-status.html

SHOW TABLE STATUS 
LIKE YourTable
WHERE dtLogTime < '2011-08-28 00:00:00' 
AND dtLogTime >= '2011-08-27 00:00:00'

【讨论】:

  • 这不起作用,它所做的只是返回了与 YourTable 对应的行。仍然没有 dtLogTime 列
  • 它不会返回 dtLogTime 列。在过滤 WHERE 子句后,它将返回表的大小。所以如果 YourTable 是 100MB,但 8/27-8/28 的行只占用 10MB,它会返回 10MB。
  • 嗯,它给了我一个错误,它不知道 dtLogTime 是什么。我的最后一条评论不好,我的意思是我已经运行了 SHOW TABLE STATUS LIKE YourTable 并且只返回了与 YourTable 对应的行。我假设这就是 WHERE 子句仍然不起作用的原因
  • @Derek SHOW TABLE STATUS 是询问INFORMATION_SCHEMA.TABLES 的便捷方法,它本身不进行计算。
【解决方案2】:

Where 子句适用于SHOW TABLE STATUS 生成的结果表,不能是您各个表的实际列。例如:

SHOW TABLE STATUS where Index_length = 0

单独运行SHOW TABLE STATUS 以查看您可以在WHERE 子句中使用的所有合法列的列表。不幸的是,对于您的情况,您必须每天运行 SHOW TABLE STATUS 并将结果存储在某处。

更新

为了澄清,SHOW TABLE STATUS 是一种查询系统表INFORMATION_SCHEMA.TABLES 的便捷方法。它将将该系统表中的结果缩减为当前数据库中的持久表。它不执行任何自己的计算。

【讨论】:

  • 谢谢,所以只是为了确认,今天做SHOW TABLE STATUS,记录每个表的大小。然后明天做 SHOW TABLE STATUS,用差值作为每日大小。对吗?
  • 你明白了。 :-) 您可能希望实际记录 Index_length 和 data_length 的大小,因为它们都将有助于您在硬盘驱动器上的物理增长。
  • 对不起,我忘了说这些表每天都会删除数据。例如,其中一张表将跟踪 2 周前的数据。因此,对于每一天的数据,我都会丢失一天的数据,因此 SHOW TABLE STATUS 应该每天返回相似的结果(而不是增加)
  • 啊。我明白了。我对我的一些数据库进行了类似的归档,这种技术对于创建触发归档的阈值很有用(例如,如果存储空间超过 100 MB,则备份并删除一半的行)。
猜你喜欢
  • 2011-11-17
  • 2011-09-25
  • 2018-04-09
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2021-11-03
  • 2012-01-22
相关资源
最近更新 更多