2

約70000行のテーブルがあります。検索、変更、保存する必要のある行は6000行あります(これは頻繁に行う必要があり、週に数回実行する必要があります)。現在、私はこのようにやっています、そしてそれは終了するのに2分以上かかります:(何かアドバイス?:()

  $query = mysql_query("SELECT meta_value FROM my_table WHERE meta_key = 'key' AND meta_value LIKE '%something%'")or die(mysql_error());

  $new = "soemthing something";

  while($row = mysql_fetch_array($query)){

    $old = unserialize($row['meta_value']);
    $new_meta_r = str_replace($old['color'],$new,$old);
    $new_meta = serialize($new_meta_r);

    $update_meta = mysql_query("UPDATE my_table SET meta_value = '$new_meta' WHERE meta_key = 'key' AND meta_value LIKE '%something%'")or die(mysql_error());
  }
4

4 に答える 4

3

最適化に役立ついくつかの方法を次に示します。

  • meta_value以外のIDを取得してみてください。更新を使用する場合は、IDを参照するだけです。
  • ワイルドカード全体を本当に使用する必要があるかどうかを確認するか、投稿またはプレフィックスを付けることができます。

意味 :

#Full wildcard  

 SELECT * FROM TABLE WHERE COLUMN LIKE '%something%';  

#Postfix wildcard  

 SELECT * FROM TABLE WHERE COLUMN LIKE  'something%';  

 #Prefix wildcard  

SELECT * FROM TABLE WHERE COLUMN LIKE  '%something'; 
  • 適切なデータ型を使用していること、varcharが適切なサイズであること、BigIntの代わりにintを使用していることなどを確認してください。
  • クエリをストアドプロシージャに移動してみてください。ストアドプロシージャはコンパイルされ(SQLコードはコンパイルされません)、SQLコードよりも高速になります。
于 2012-06-12T13:20:59.970 に答える
2

最初のクエリの主キーを保存して更新で使用する以外に、一時テーブルを作成し、そのテーブルにバッチ挿入してから、プライマリテーブルで結合更新を行うことができます。

そうすれば、サイクルでクエリを実行する必要がなくなります。

一時テーブルの作成

于 2012-06-12T13:18:29.680 に答える
2

'meta_key'にインデックスを付けて、これらの操作にLIKEを使用する必要があることを回避してみてください。なぜここにLIKEが必要なのですか?正確な要件は何ですか?

于 2012-06-12T13:17:03.873 に答える
1

私はPHPの人ではありませんが、SQL側では何か提案することができます。あなたができることがいくつかあります、

あなたのSQLステートメントは、

SELECT meta_value FROM my_table WHERE meta_key ='key' AND meta_value LIKE'%something%'

あなたにできることは、

  1. 提出されたキーにインデックスを追加します。クエリには2つのファイルmeta_key、meta_valueがあります。両方に、複合インデックスまたは個別のインデックスを追加してみてください。

  2. クエリでは、whereブロックのどの句がより多くの行を返すかを確認します。それを他のものの前に置いてください。

    Q1:SELECT meta_value FROM my_table WHERE meta_value LIKE'%something%'

    Q2:SELECT meta_value FROM my_table WHERE meta_key ='key'

    Q1がQ2SQLステートメントよりも多くの行を返す場合、SQLは次のようになります。

    SELECT meta_value FROM my_table WHERE meta_value LIKE'%something%' AND meta_key ='key'

于 2012-06-12T13:18:30.237 に答える