1

考虑到 MySQL 中的下表列,我想计算每个月表大小的增长:

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

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

例如:

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

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

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

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

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

谢谢。

4

1 回答 1

0

刚刚看到这篇文章,对不起,但评论不是很有用,所以决定给出一个答案,分享我在我的一个 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;

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

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

于 2016-09-19T20:51:50.490 回答