tableau:La meilleure façon de supprimer 5K lignes de la table InnoDB avec 30M lignes
- foreign_id_1
- foreign_id_2
- entier
- date1
- date2
- primaire (foreign_id_1, foreign_id_2)
Requête: delete from table where (foreign_id_1 = ? or foreign_id_2 = ?) and date2 < ?
Sans requête de date prend environ 40 secondes. C'est trop élevé :(Avec date beaucoup plus longtemps ..
Les options sont:
create
une autre table etinsert
select
, puisrename
limite d'utilisation et d'exécuter la requête plusieurs fois- requête fractionnée à exécuter pour
foreign_id_1
puisforeign_id_2
- utiliser sélectionner, puis supprimer par une seule ligne
Y at-il un moyen plus rapide?
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)
S'il vous plaît poster les résultats d'un 'EXPLAIN' sur votre requête. Mon argent est sur l'indexation insuffisante. – Blrfl
Ajout d'explications de requête – zhekanax
La combinaison des options 3 et 4 est une bonne façon de procéder, à condition que vos SELECTS soient suffisamment rapides. Vous ne pouvez pas vous tromper avec les suppressions PK. :) – Riedsio