2011-10-19 9 views
0

私はこれらに類似したクエリを使用して別のものに一つのテーブルからデータを集約しています:MySQLのテーブル内の行の大部分を交換

DELETE FROM wp_popular WHERE popular_type='favorites'; 
INSERT INTO wp_popular (post_id, popular_type, period, popular_value) 
    SELECT post_id, 'favorites' AS popular_type, '30-days' AS period, COUNT(user_id) AS popular_value ; 
    FROM wp_favorites WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= favorited_date 
    GROUP BY post_id; 
INSERT INTO wp_popular (post_id, popular_type, period, popular_value) 
    SELECT post_id, 'favorites' AS popular_type, '' AS period, COUNT(user_id) AS popular_value 
    FROM wp_favorites GROUP BY post_id; 

これはほとんど分のテーブルをロックしています。いいえ。

私の最初の考えは、一時テーブルで作業を行い、その内容を元のテーブルにダンプすることでした。これは次のようになります。

CREATE TEMPORARY TABLE wp_new_popular LIKE wp_popular; 
INSERT ... 
DELETE FROM wp_popular WHERE popular_type='favorites'; 
INSERT INTO wp_popular SELECT * FROM wp_new_popular; 

これらの最後の2つのクエリにはそれぞれ数秒もかかります。どのように私はそれをスピードアップできる任意の提案?

wp_popularの内容が完全に消去されて置き換えられるように、私のアプリをちょっと変更することができます。私はTRUNCATEテーブルを交換してその内容を置き換えることができたと思います。 wp_popularを削除してwp_new_popularという名前を変更するほうが簡単でしょうか?私は一時的なテーブルでそれを行うことはできますか?

+0

上記の最初のブロッククエリは、セミコロンのために行番号3でエラーを確定します。 – Bryan

+0

正規化されていないテーブルにデータをコピーする特別な理由はありますか?正しいインデックスを置いてメインテーブルからのクエリは直接あなたのために働かないのですか? – Tomalak

+0

実際のテーブルに一時テーブルの名前を変更すると動作するようですが、接続が閉じられたときにテーブルがまだ消えます。それは終わりのようです。 –

答えて

0

私が思いついた解決策は、新しい(通常の)テーブルを作成し、それにすべての高価な操作を行い、その後RENAMEを使用して既存のテーブルと交換することでした。これは次のようになります。

CREATE TABLE wp_new_popular LIKE wp_popular; 
INSERT ... 
RENAME TABLE wp_popular TO wp_old_popular, wp_new_popular TO wp_popular 
DROP TABLE wp_old_popular 
関連する問題