mysqlで、number の部分の符号を全て、高速に、正or反転(早ければどちらでも構いません)させたいのですが、どのようにすればよいでしょうか?

レコード数が百万以上と膨大なためより効率的な方法を探しています。
宜しくお願い致します。
-----
MYSQL ver,4.0(副問い合わせは使えません)
-----
number bigint
n1 char
n2 char
--test_table--
number n1 n2
-5   s  tw
-7   p  ee
-4   e  ww
-2   e  ty

回答の条件
  • 1人2回まで
  • 登録:2008/12/23 18:55:11
  • 終了:2008/12/24 05:47:36

回答(1件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542008/12/23 22:24:26

ポイント60pt

インデクスが定義されていて、正の数が多いなら、正の数あるいは絶対値にすることで、インデクスの断片化が起こらないので速く行えます。


しかし、

  • インデクスはない
  • インデクスはあっても、負が殆どで、それを正または絶対値とする

といった操作では、正にしたり、絶対値にしたり、反転といったことで、性能差は現れません。

なぜなら、格納済の行の配置がまったく変化しないからです。

id:ele_dir

回答いただきありがとうございます。

具体的にはどのようなクエリを発行すればよいでしょうか?

2008/12/24 02:55:57
  • id:munyaX
    SQLを発行しても良いのですが、一度ファイルにエキスポート。何らかの方法でデータ加工後、別テーブルにインポート。問題なければリネームするのが安全確実な気がします。
     ※作業時に、(手順的に)自動でバックアップ取れますしね。

    ■MySQL エクスポートとインポート
    http://www.avant-tokyo.com/linux/mysql_export_import.html


    Perlなら以下のようなイメージで変換可能。

    #!/usr/bin/perl
    while(<STDIN>){
    my @buff = split(/\t/);
    $buff[0] = abs($buff[0]);
    print join("\t", @buff);
    }
  • id:ele_dir
    コメント頂きありがとうございます。
    今回、この方法も考えたのですが、DBからのエクスポート、インポート、perl処理と3度に渡り、CPU負荷が発生するため、なるべくCPU負荷をかけない方法をと考えて敬遠しています。
  • id:chuken_kenkou
    SQLによるUPDATEは、かなりCPU負荷が高いです。
    ファイル上で更新した方が、結果的にCPU負荷は軽減されることも多いです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません