質問

テーブル:

  • 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';
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top