Aggiornamento grande tavolo
-
16-10-2019 - |
Domanda
Ho questi due tabelle:
user_profile:
user_profile_id_int int primary key
user_profile_id varchar
user_activity:
user_profile_id_int int key
user_profile_id varchar
entrambi i campi in profilo_utente sono ok, ma non ho l'user_profile_id_int da user_activity e voglio aggiornarlo utilizzando la mappa che ho in profilo_utente. Ho scritto una query come questa:
update user_activity a
set user_profile_id_int =
(select user_profile_id_int from user_profile b
where a.user_profile_id = b.user_profile_id);
E 'stato in esecuzione su un server di veramente forte per 1 giorno e mi si è fermato. Ma per la registrazione è stato aggiornato.
2 domande qui:
- C'è un modo migliore e più veloce per fare questo?
- E 'in questo modo ok?
Soluzione
risposta alla domanda 1
Questo dovrebbe farlo per voi
UPDATE user_activity a
INNER JOIN user_profile b
USING (user_profile_id)
SET a.user_profile_id_int = b.user_profile_id_int;
Questo funzionerà in MySQL. Se non siete abituati a che uniscono la sintassi, fare questo:
UPDATE user_activity a
INNER JOIN user_profile b
ON a.user_profile_id = b.user_profile_id
SET a.user_profile_id_int = b.user_profile_id_int;
Sia dovrebbe funzionare.
risposta alla domanda 2
la tua ricerca, in teoria, funziona. Tuttavia, un'occhiata a quello che sta facendo:
Una scansione tabella user_activity
, una ricerca indicizzata della user_profile_id_int
utilizzando la chiave primaria della user_profile
, e un aggiornamento sul posto della riga corrente user_activity
.
La query sta colpendo due tavoli e due chiavi primarie, avanti e indietro, su una base per-riga. Tutte le fasi rallentano l'un l'altro. Così, si ottiene una query duri più a lungo.
CAVEAT
L'aggiunta di un indice composto sulla user_profile
dovrebbe accelerare le cose:
ALTER TABLE user_profile ADD INDEX (user_profile_id,user_profile_id_int);
Altri suggerimenti
penso che si può provare ad aggiungere LIMIT
per l'aggiornamento (e modificare un po 'WHERE
per filtrare i record già cambiato). Se lo fai, per esempio, LIMIT 100
, esso non prendere 1 giorno. Sicuramente, se si desidera modificare tutti i record, si dovrà scrivere uno script che esegue UPDATE
fino al numero di righe aggiornate è 0, ma non bloccherà l'intera tabella.