我们的MySQL网站分析数据库包含一个摘要表,该表在导入新活动时全天更新.我们使用ON DUPLICATE KEY UPDATE以便汇总覆盖先前的计算,但由于汇总表的UNIQUE KEY中的一列是可选的FK并且包含NULL值,因此很难.
这些NULL旨在表示"不存在,并且所有这些情况都是等效的".当然,MySQL通常将NULL视为"未知,所有这些情况都不等同".
基本结构如下:
"活动"表,其中包含每个会话的条目,每个条目都属于一个广告系列,其中包含某些条目的可选过滤器和事务ID.
CREATE TABLE `Activity` (
`session_id` INTEGER AUTO_INCREMENT
, `campaign_id` INTEGER NOT NULL
, `filter_id` INTEGER DEFAULT NULL
, `transaction_id` INTEGER DEFAULT NULL
, PRIMARY KEY (`session_id`)
);
Run Code Online (Sandbox Code Playgroud)
"摘要"表,其中包含活动表中会话总数的每日汇总,d表示包含事务ID的会话总数.这些摘要是分开的,每个广告系列和(可选)过滤器的组合都有一个.这是一个使用MyISAM的非事务性表.
CREATE TABLE `Summary` (
`day` DATE NOT NULL
, `campaign_id` INTEGER NOT NULL
, `filter_id` INTEGER DEFAULT NULL
, `sessions` INTEGER UNSIGNED DEFAULT NULL
, `transactions` INTEGER UNSIGNED DEFAULT NULL
, UNIQUE KEY (`day`, `campaign_id`, `filter_id`)
) ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)
实际的摘要查询类似于以下内容,计算会话数和事务数,然后按广告系列和(可选)过滤器进行分组.
INSERT INTO `Summary`
(`day`, `campaign_id`, …Run Code Online (Sandbox Code Playgroud) 我试图向优化90GB +表迈出一步:
旧表
桌子每天抓住大约.来自外部源的750,000条记录,并使用新日期将它们添加到表中.根据我的理解,这已经持续了三年.97%的记录从一天到下一天都没有变化.
新表
我试图通过旧表(数以百万计的记录)并消除冗余,这可能会极大地减少表的大小.
OLD_TABLE
new_table_index
NEW_TABLE
我们遍历old_table中的每条记录时的逻辑
if(record_id不在new_table中)或(record_id在new_table中,但最新的条目有不同的data_field)
将其插入new_table并获取index_id
其他
从new_table_index获取该record_id的最新条目index_id
总是
将index_id和date插入new_table_index
有关最佳方法的任何想法吗?我没有足够先进的MySQL将这一切放在一起.当我尝试用PHP编写脚本时,它耗尽了3GB内存然后失败了.其他建议或疑问??? 非常感谢!