2017-10-31 7 views
-2

私たちはMySQLデータベースのデータベースを持ち、購入した製品を販売しています。過去3年間はログインしていない非アクティブなユーザーを移動させ、当社のWebサイトで何かを購入または販売したことは決して別のテーブルに移す必要はありません。各テーブルには数百万のエントリがあります。MySQLは条件によってテーブルを別のテーブルに移動します

これは販売アイテムのテーブルです。約40mのエントリー。

CREATE TABLE `sold` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `uid` int(10) unsigned NOT NULL, 
    `item` bigint(20) DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `uid` (`uid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

これは購入したアイテムのテーブルです。 6mぐらいのエントリー。

CREATE TABLE `purchased` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `uid` int(10) unsigned NOT NULL, 
    `item` bigint(20) DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `uid` (`uid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

これは約17mのエントリのユーザーテーブルです。

CREATE TABLE `users` (
    `uid` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(32) DEFAULT '', 
    `email` varchar(64) DEFAULT NULL, 
    `lastlogin` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`uid`), 
    UNIQUE KEY `email_index` (`email`), 
    KEY `lastlogin` (`lastlogin`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

これは、我々は最小限のダウンタイムでこれを達成するためにどのように

CREATE TABLE `inactiveusers` (
    `uid` int(10) unsigned NOT NULL, 
    `name` varchar(32) DEFAULT '', 
    `email` varchar(64) DEFAULT NULL, 
    `lastlogin` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`uid`), 
    UNIQUE KEY `email_index` (`email`), 
    KEY `lastlogin` (`lastlogin`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

任意の提案に非アクティブなユーザーを移動する必要があるテーブルのですか?

答えて

0

@ Yumoji、私はあなたの問題は、どのような活動の最後の3年間を計算するかと思います。右?

その場合は、DBテーブルに「created_at」列を追加する必要があります。

テーブルにcreated_atカラムを追加すると、過去3年間のアクティビティを簡単に計算できます。 ここでは、あなたが次に、ユーザIDを取得し、このクエリから

SELECT uid FROM sold AND purchased WHERE sold.created_at>DATE_SUB(NOW(), INTERVAL 3 YEAR) OR purchased.created_at>DATE_SUB(NOW(), INTERVAL 3 YEAR); 

をIS- -

INSERT INTO inactiveusers select * from users where uid = 'the user ids u get'; 
DELETE FROM users where uid = 'the user ids u get'; 

私はそれが問題を解決したいと考えています。乾杯。

関連する問題