2016-07-03 5 views
1

私は7500万を超えるレジスタを持つテーブルを持っています。私は、このレジストリを要約するためにグループを運営したいと思っています。大きなテーブルのMySQL GROUP BY

テーブルの構造は次のとおりです。

CREATE TABLE `output_medicos_full` (
    `name` varchar(100) NOT NULL DEFAULT '', 
    `term` varchar(50) NOT NULL DEFAULT '', 
    `hash` varchar(40) NOT NULL DEFAULT '', 
    `url` varchar(2000) DEFAULT NULL, 
    PRIMARY KEY (`name`,`term`,`hash`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

私は、クエリ怒鳴るを実行したいのですが、4GBのRAMをささげるのMySQLサーバ5.5を使用している限り取っている:

INSERT INTO TABLE report 
SELECT 
    `hash` 
    ,CASE UPPER(SUBSTRING_INDEX(url, ':', 1)) 
     WHEN 'HTTP' THEN 1 
     WHEN 'HTTPS' THEN 2 
     WHEN 'FTP' THEN 3 
     WHEN 'FTPS' THEN 4 
     ELSE 0 end 
    ,url 
FROM output_medicos_full 
GROUP BY `hash`; 

テーブルレポートにありハッシュカラムのユニークなインデックス

スピードアップに役立つのは何ですか?

ありがとうございました

+0

もちろんです。すべてのレコードで関数を使用しています。インデックスでさえそれをより速くするでしょう。他のDBエンジンでは、クエリは失敗します。なぜあなたはURL列を集計していないのでしょうか? –

+0

@juergend MySQLにはこれがないかもしれませんが、いくつかのRDBMS(例えば、Oracle)_do_には機能インデックスがあります。 –

+0

@あなたのハッシュ値はvarchar(40)なので、相当な長さになります。インデックスにはなりますが、パフォーマンスに影響を与える可能性があります。 –

答えて

1

ここでの主な費用はすべてI/Oです。テーブル全体を読み取る必要があります。

innodb_buffer_pool_size = 2Gは、4GBのRAMには危険があります。スワップが発生すると、パフォーマンスがひどく損なわれます。

hashはSHA1であるため、わずか75MのURLでユニークである可能性が非常に高いです。したがって、GROUP BYは75Mの行を生成します。これはおそらくあなたが望むものではありません。クエリを書き直すと、最適化について議論することができます。