相关疑难解决方法(0)

MySQL ON DUPLICATE KEY UPDATE,唯一键中的可空列

我们的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)

mysql nullable summarization

14
推荐指数
1
解决办法
8100
查看次数

需要MySQL INSERT - SELECT查询具有数百万条记录的表

我试图向优化90GB +表迈出一步:

旧表

桌子每天抓住大约.来自外部源的750,000条记录,并使用新日期将它们添加到表中.根据我的理解,这已经持续了三年.97%的记录从一天到下一天都没有变化.

新表

我试图通过旧表(数以百万计的记录)并消除冗余,这可能会极大地减少表的大小.

OLD_TABLE

  • 日期
  • RECORD_ID
  • data_field(真的很多字段,但为了示例)

new_table_index

  • 日期
  • index_id的

NEW_TABLE

  • index_id的
  • RECORD_ID
  • data_field中

我们遍历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内存然后失败了.其他建议或疑问??? 非常感谢!

php mysql

1
推荐指数
1
解决办法
7420
查看次数

标签 统计

mysql ×2

nullable ×1

php ×1

summarization ×1