1)テーブルのレコード件数を確認(以下では、80億件以上あると仮定)
select count(*) from pay_log;
8,089,562,456
→このレコードを他のテーブルと結合するとめっちゃ重くなるなぁ。
そんな時は、
2)一時テーブルを作成 ↓
CREATE temporary TABLE `tmp_x1` ( `pay_ymd` date NOT NULL COMMENT '商品購入日', `account_id` int(11) unsigned NOT NULL COMMENT 'ユーザーID', PRIMARY KEY (`account_id`), INDEX (account_id) ## インデックスはっとこう! ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='一時テーブル';
3)テーブルから一時テーブルに対象データをいれる ↓ (ここでは2015-1-1以降の購買データを設定)
insert into tmp_x1 select pay_ymd , account_id from pay_log where pay_ymd >= '2015-01-01';
4)一時テーブルのレコード件数を確認
select count(*) from tmp_x1 ;
15,411,008
→これぐらいの件数なら処理しやすい!少なくとも最初の状態よりは。
SQL書いていると、たま~に全レコードを検索しちゃう場合があります。
業務アプリとかだとその辺最適化されてること多いのですが、最近のWEBアプリとかだと、軽量化する為、テーブルのインデックス張っていない。という場合があったりします。
そういった場合に、一時テーブルに処理対象レコードうつしつつインデックスも貼ってしまう。という感じになるかなと。