Domanda

Tavolo:

  • foreign_id_1
  • foreign_id_2
  • integer
  • date1
  • date2
  • primaria (foreign_id_1, foreign_id_2)

Domanda: delete from table where (foreign_id_1 = ? or foreign_id_2 = ?) and date2 < ?

Senza data query richiede circa 40 sec. Questo è troppo alta :( Con data molto più lunga ..

Le opzioni sono:

  • create un altro tavolo e insert select, quindi rename
  • limite di utilizzo e di query eseguire più volte
  • interrogazione diviso a correre per foreign_id_1 poi foreign_id_2
  • uso selezionare quindi eliminare dalla singola riga

C'è un modo più veloce?


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)
È stato utile?

Soluzione 2

Ormai quantità di dati è 40M (+ 33%) e in rapida crescita. Così ho iniziato a cercare altro, alcuni no-SQL, soluzione.

Grazie.

Altri suggerimenti

Avere un OR nel vostro WHERE rende MySQL riluttante (se non completamente rifiutare) per utilizzare gli indici sul user_id e / o campi person_id (se non v'è alcuna - che mostra la CREATE TABLE indicherebbe se ci fosse).

Se è possibile aggiungere gli indici (o modificare quelli esistenti dal momento che sto pensando di indici composti), avrei probabilmente aggiungere due:

ALTER TABLE compatibility 
ADD INDEX user_id_updated_at (user_id, updated_at),
ADD INDEX persona_id_updated_at (person_id, updated_at);

Corrispondentemente, assumendo le righe a DELETE non dovevano essere essere soppresso atomico (cioè si verificano nello stesso istante).

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';
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top