【问题标题】:Calculate table size in MySQL for one month in MB计算 MySQL 中一个月的表大小(以 MB 为单位)
【发布时间】:2012-07-30 14:12:00
【问题描述】:

我想计算我的表每个月的增长情况,考虑 MySQL 中的下表列:

id (BIGINT) - Primary Key
Date (DateTime)
PageViews (INT)
ProductId (INT)

我的商店有 2000 种产品。在最坏的情况下,每个产品每天至少会被查看一次。每行代表特定产品每天的总页面浏览量。

例如:

id = 6
DateTime = 02/12/2012
PageViews = 0
ProductId = 159

我想计算表的总大小,或者更好地说,以 KB 或 MB 为单位的每个月的增长。

我知道有很多事情我应该考虑并附加到计算中,但我不知道它们并且不知道如何计算它们。

我打算将我的 MySQL 数据库存储在 Xeround.com 上,限制为 50GB,因此我需要确保在使用此架构时,我可以放心,在接下来的 10 年里,我不会有任何问题: )

每年(大约)会增加 100 种产品。

谢谢。

【问题讨论】:

  • 您能否确认文章数量或多或少保持不变,但每条记录上每天都有大量update pageviews?因为如果是这种情况,并且其他地方没有insert,那么数据库大小应该保持相当恒定。
  • MySQL 手册有一个详细的“数据类型存储要求”部分,您可以在例如找到。 dev.mysql.com/doc/refman/5.0/en/storage-requirements.html 如果你用谷歌搜索“mysql 字段类型大小”
  • fvu, 产品(不是文章)的数量在2000个左右,大约每年增长100个产品。所以插入会不时出现。我将需要创建一个查询来检查产品是否在特定日期存在,如果不存在,则将其插入特定日期(DateTime)
  • @IdanShechter 所以每天每个产品会有 1 条记录?而 pageviews 是当天的浏览量?
  • 我认为 50GB 的数据库空间就足够了。根据您的描述,我认为您永远不会遇到限制。如果您查看您描述的最坏情况 - 我们有 3000 种产品乘以 10 年乘以 365 天,并且我们每个条目大约 2KB(这是过于臃肿的估计),我们最终在 10 年内仍然只有大约 20Gb 的数据我能想象到的最糟糕的情况。

标签: mysql sql


【解决方案1】:

刚刚看到这篇文章,对不起大家,但是 cmets 不是很有用,所以决定在我的一个 mySQL 服务器上分享我的答案。

并非每个人都跟踪它自己的数据库增长,但实施起来并不难。 这个想法是每周或根据您的需要从 INFORMATION_SCHEMA.TABLES 中简单地捕获表统计信息。

首先,您在单独的架构或您喜欢的任何架构下创建一个表。

#
# Use stats_db for the default schema for this tool
#

USE stats_db;

#
# CREATE TABLE table_growth_history
#

DROP TABLE IF EXISTS `table_growth_history` ;

CREATE TABLE `table_growth_history`
(
            `DATE` date not null
,
            `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT ''
,
            `TABLE_NAME` varchar(64) NOT NULL DEFAULT ''
,
            `ENGINE` varchar(64) DEFAULT NULL
,
            `TABLE_ROWS` bigint(21) unsigned DEFAULT NULL
,
            `DATA_LENGTH` bigint(21) unsigned DEFAULT NULL
,
            `INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL
,
            `DATA_FREE` bigint(21) unsigned DEFAULT NULL
,
            `AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL
,
            PRIMARY KEY(DATE,TABLE_SCHEMA,TABLE_NAME)
,
            KEY(TABLE_SCHEMA,TABLE_NAME)
)
            ENGINE=INNODB DEFAULT CHARSET=utf8;

然后添加插入脚本。您也可以使用 cronjob,但我更愿意使用 MySQL EVENT 调度程序:

#
# MySQL EVENT to add table stats for our new history table
#

DELIMITER ;;

CREATE
            EVENT IF NOT EXISTS `get_table_growth_history`
            ON SCHEDULE EVERY 1 WEEK
    STARTS CURRENT_DATE + INTERVAL 7 - WEEKDAY(CURRENT_DATE) DAY
    ON COMPLETION PRESERVE ENABLE
            DO BEGIN

INSERT INTO
                                            stats_db.table_growth_history
SELECT
       DATE(NOW())
            ,
       TABLE_SCHEMA
            ,
       TABLE_NAME
            ,
       ENGINE
            ,
       TABLE_ROWS
            ,
       DATA_LENGTH
            ,
       INDEX_LENGTH
            ,
       DATA_FREE
            ,
       AUTO_INCREMENT
FROM  
                            INFORMATION_SCHEMA.TABLES;

    END ;;
    DELIMITER ;

这将为下周一创建一个事件,然后每周一将数据插入表中。根据您的需要更改日期

现在您需要的是表数据增长的月度报告,您可以使用此查询来获得,一旦完成 1 个月的数据捕获,您就可以运行它:

-- get dates

select distinct `date` from stats_db.table_growth_history order by `date` desc limit 1 INTO @this_week ;

set @last_month := @this_week - interval 4 week ;

-- pivot table
SET @report_monthly = NULL;
SET @report_monthly
  = CONCAT('select table_schema,table_name,
       max(case when date = @last_month then round(((data_length + index_length) / 1024 / 1024), 2) end) as `last_month__',@last_month,'`,
       max(case when date = @this_week then round(((data_length + index_length) / 1024 / 1024), 2) end) as `current_week__',@this_week,'`,
       (max(case when date = @this_week then round(((data_length + index_length) / 1024 / 1024), 2) end) -
        max(case when date = @last_month then round(((data_length + index_length) / 1024 / 1024), 2) end)
       ) as data_grow
from stats_db.table_growth_history t
where date in (@last_month , @this_week)
group by table_name');

PREPARE stmt FROM @report_monthly;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

您也可以根据需要更改时间范围。

您将获得服务器中所有数据库的规格和大小。

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 2020-09-30
    • 2014-06-12
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多