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アプリとかだと、軽量化する為、テーブルのインデックス張っていない。という場合があったりします。

そういった場合に、一時テーブルに処理対象レコードうつしつつインデックスも貼ってしまう。という感じになるかなと。

おすすめの記事