2012-01-30 23 views
0

私は1億1600万行の巨大なテーブルを持っています。テーブル構造はentryid(varchar), dater(date), region(char), detail(varchar), views(int)であり、最初の4つの列は主キーとして一緒になっています。私は、次のような処理をしたい:大規模データベーステーブルのグループ化と更新

  1. detailgoogleためLIKE "%.google.%"を使用して、例えば、同じドメインからのグループにそれらの行を私が欲しいなどwww.google.comwww.google.cawww.google.ukwww.facebook.comfacebook.com、などのURLを含んでいますfacebookの場合はLIKE "%.facebook.%" OR LIKE "facebook.%"で十分です。しかし、行を更新する場合は、viewsを合計するためにON DUPLICATE KEY UPDATEを使用する方法重複するキーがあるかもしれませんか?そして、LIKE以外の速い方法がありますか?

  2. region列を削除して行をグループ化し、viewsを合計して新しい表に挿入したいとします。 1つのコマンドでそれを行うには?

  3. 行をグループ化して(月間にviewsを更新したい)、

+0

既存のディテール表に基づいて集計表を作成する必要があるようですね。既に試したSQLがありますか? –

+0

この表のパーティションも考慮してください。 –

答えて

0

ごと行、詳細フィールドはwww.something.comようになっていることを仮定して、MYSQLのために、これを試してみてください。

SELECT 
    MONTH(dater), 
    SUBSTRING_INDEX(SUBSTRING_INDEX(detail, '.', 2), -1) as url, 
    sum(views) 
from table 
group by 
    MONTH(dater), 
    SUBSTRING_INDEX(SUBSTRING_INDEX(detail, '.', 2), -1) 

それとも、それは少しクリーナーを見えるようにサブクエリを使用することができます。

SELECT mth, url, sum(views) from 
(
SELECT 
    MONTH(dater) as mth, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(detail, '.', 2), -1) as url, 
    views 
from table) subq 
group by 
    mth, url 
+0

1,161万行では、ビーストデータベースを持っていない限り、実行には時間がかかることに注意してください。おそらく、これの一部として 'CREATE TABLE AS'をやりたがります。 –

+0

'detail'フィールドが単純ではない場合はどうなりますか?基本的には、「何か%」や「%.something。%」や「%.something」のようになりますか? – DrXCheng

+0

本質的にはい - SUBSTRING_INDEX関数は文字列の最初と最後の部分だけを取り除きます。これは、そのフィールドのパターンに従わない文字列では問題になります。 MYSQLの他の文字列関数を使用して値を抽出することもできます(ドキュメントには、できることの完全なリストが含まれています)。別のオプションは、テーブルに "extracted_domain"カラムなどを追加し、事前にテーブルに対してプロセスを実行し、その行を「抽出された」ドメインロジックで更新して、新しいフィールドでグループ化します。 –

関連する問題