2

テーブル:

  • 外部ID_1
  • 外部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
  • limit を使用してクエリを複数回実行する
  • 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)
4

2 に答える 2

2

を使用するORと、WHEREMySQL は (完全に拒否しない場合でも)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';
于 2010-12-02T21:07:02.313 に答える
0

現在のデータ量は 40M (+33%) で、急速に増加しています。だから私は他のいくつかのSQLなしのソリューションを探し始めました。

ありがとう。

于 2010-12-04T04:43:05.500 に答える