30m行でInnodbテーブルから5k行を削除する最良の方法
-
30-09-2019 - |
質問
テーブル:
- foreign_id_1
- foreign_id_2
- 整数
- 日付1
- 日付2
- プライマリ(foreign_id_1、foreign_id_2)
クエリ: delete from table where (foreign_id_1 = ? or foreign_id_2 = ?) and date2 < ?
日付のクエリなしで約40秒かかります。それは高すぎます:(日付がはるかに長いです。
オプションは次のとおりです。
create
別のテーブルとinsert
select
, 、 それからrename
制限を使用してクエリを複数回実行します- 実行するためにクエリを分割します
foreign_id_1
それからforeign_id_2
- 選択]を使用して、単一行で削除します
より速い方法はありますか?
mysql> explain select * from compatibility where user_id = 193 or person_id = 193 \G
id: 1
select_type: SIMPLE
table: compatibility
type: index_merge
possible_keys: PRIMARY,compatibility_person_id_user_id
key: PRIMARY,compatibility_person_id_user_id
key_len: 4,4
ref: NULL
rows: 2
Extra: Using union(PRIMARY,compatibility_person_id_user_id); Using where
1 row in set (0.00 sec)
mysql> explain select * from compatibility where (user_id = 193 or person_id = 193) and updated_at < '2010-12-02 22:55:33' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: compatibility
type: index_merge
possible_keys: PRIMARY,compatibility_person_id_user_id
key: PRIMARY,compatibility_person_id_user_id
key_len: 4,4
ref: NULL
rows: 2
Extra: Using union(PRIMARY,compatibility_person_id_user_id); Using where
1 row in set (0.00 sec)
解決 2
現在、データ量は40m(+33%)で、急速に成長しています。それで、私は他の、いくつかのノーSQLの解決策を探し始めました。
ありがとう。
他のヒント
持っている OR
あなたの中で WHERE
mysqlを嫌がらせします(完全に拒否していないにしても)あなたのインデックスを使用することを user_id
および/または person_id
フィールド(ある場合 - を表示します CREATE TABLE
あるかどうかを示します)。
複合インデックスを考えているので、既存のインデックスを追加できます(または既存のインデックスを変更している場合)、2つを追加する可能性があります。
ALTER TABLE compatibility
ADD INDEX user_id_updated_at (user_id, updated_at),
ADD INDEX persona_id_updated_at (person_id, updated_at);
それに応じて、行を想定します DELETE
原子的に削除する必要はありませんでした(つまり、同じ瞬間に発生します)。
DELETE FROM compatibility WHERE user_id = 193 AND updated_at < '2010-12-02 22:55:33';
DELETE FROM compatibility WHERE person_id = 193 AND updated_at < '2010-12-02 22:55:33';
所属していません StackOverflow