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:

  1. C'è un modo migliore e più veloce per fare questo?
  2. E 'in questo modo ok?
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top