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
という名前を変更するほうが簡単でしょうか?私は一時的なテーブルでそれを行うことはできますか?
上記の最初のブロッククエリは、セミコロンのために行番号3でエラーを確定します。 – Bryan
正規化されていないテーブルにデータをコピーする特別な理由はありますか?正しいインデックスを置いてメインテーブルからのクエリは直接あなたのために働かないのですか? – Tomalak
実際のテーブルに一時テーブルの名前を変更すると動作するようですが、接続が閉じられたときにテーブルがまだ消えます。それは終わりのようです。 –