Il modo migliore per eliminare 5K righe dalla tabella InnoDB con file 30M
-
30-09-2019 - |
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 einsert
select
, quindirename
-
limite di utilizzo e di query eseguire più volte - interrogazione diviso a correre per
foreign_id_1
poiforeign_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)
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';