2016-12-03 14 views
1

私たちのデータベースには、ユーザーの動作を追跡するテーブルがあります。 基本的に、ユーザーが閲覧した各ページはこれを追跡します。私たちは次のことを持っている表で30millionのレコードテーブルをクリーンアップする方法

id | user_id | user_ip | page | created_on 

ユーザーはPCからサイトをチェックし、の彼は、システムが「ページ」の下に保存し、特定の記事に続く「/記事/特定を/チェックしましょうしかし、ユーザーが同じページを携帯電話のウェブサイトからチェックすると、「http://m.website.com/article/specific/slug

これを変更しようとしています。

私たちは、列挙型(PC、M)としてデータベースに新しいフィールドを追加したので、私たちは常に「ページ」の下に保存するデバイスに関係なく欲しい「/記事/特定/スラッグ」

1つの問題は、ということです過去3,000万件のレコードを変換する必要があります。

意味「http://m.website.com」が存在するかどうかをチェックするクエリを作成し、「http://m.website.com」を削除し、「デバイス」フィールドを「m」として更新するフィールドを更新します。

誰か助けてもらえますか?

+0

問題は何ですか。そのクエリを書くには?またはライブサーバー上の3000万行のテーブルに対して実行する方法は? – cherouvim

+0

質問は実際に私はクエリが必要ですが、実際には3000万行で実行できるものです。 – Hossj

+0

MySQLの負荷が懸念される場合は、常にテーブルをファイルにダンプし、 'sed'などのコマンドラインツールを使用して(おそらく別のサーバでも)変更を加え、ファイルからテーブルをインポートします –

答えて

1

問合せ:

update visits_table 
set 
    page=replace(page, 'http://m.website.com', ''), 
    device='m' 
where 
    page like 'http://m.website.com%'; 

あなたは... 30のミルの行を通過する必要があります30のミルの行を通過します。だから、あなただけ上記のクエリのいずれかでそれをやるのいずれか:(?例えば早朝)サイトのトラフィックが少ないサイトはメンテナンス

  • のためにダウンしているとき

    • いつでも好きなときに、それが完了するまでmysqlにいくらかのストレスがかかることがあります(時間がかかることがあります)。

    idsが増分である場合は、多くのクエリでクエリを分割してバッチを更新できます。例:

    update ... where ... and id between 1 and 1000000; 
    update ... where ... and id between 1000001 and 2000000; 
    update ... where ... and id between 2000001 and 3000000; 
    ... 
    
  • 関連する問題