2010-09-20 25 views
3

Est-ce que quelqu'un sait ce qui serait plus efficace et utiliser moins de ressources:performances MySQL: insertion imbriqué/clé en double vs plusieurs mises à jour

Méthode 1 - Utilisation d'une instruction SELECT unique pour obtenir des données d'une table, puis itérer à travers elle pour exécuter plusieurs UPDATEs sur une autre table. PAR EXEMPLE. (Pseudo-code, exécution() exécute la requête):

Query1_resultset = execute("SELECT item_id, sum(views) as view_count FROM tableA WHERE condition=1"); 
while(Query1_resultset as row) { 
    execute("UPDATE tableB SET view_count=row.view_count WHERE id=row.item_id"); 
} 


Méthode 2 - Utilisez un INSERT .. sur instruction UPDATE DUPLICATE KEY avec une instruction SELECT imbriquée. .: par exemple

INSERT INTO tableB (id, view_count) SELECT item_id, SUM(views) as view_count FROM tableA WHERE condition=1 ON DUPLICATE KEY UPDATE view_count=VALUES(view_count); 

Note: ID sur tableB est une clé primaire. Il n'y aura pas d'INSERTS car je sais que la clé existera. Donc, tout est UPDATEs. Juste en utilisant cette instruction pour transmettre une seule requête plutôt que plusieurs.

Je suis vraiment curieux de savoir pourquoi l'un ou l'autre serait plus efficace. Est-ce le nombre de requêtes qui détermine la rapidité d'exécution? Où est le goulot d'étranglement? Je cherche quelque chose qui va évoluer (le nombre de lignes mises à jour augmente chaque jour).

Des idées?

Merci

Répondre

0

Je pense que INSERT.. ON DUPLICATE KEY UPDATE est plus efficace (sinon, il ne serait pas d'ajouter beaucoup de sens une telle extension). En passant, votre premier exemple n'est pas exactement le même que le second - vous n'utilisez ni transactions ni verrouiller la table, il est donc possible que l'enregistrement retourné par SELECT n'existera pas au moment où vous exécutez UPDATE.

2

Cela dépend de votre taux de mise à jour/insertion. Si vous avez beaucoup d'insertions et seulement quelques mises à jour, l'instruction INSERT ... ON DUPLICATE KEY UPDATE sera plus rapide.

Si vous avez principalement des mises à jour, vous obtiendriez mieux avec une instruction UPDATE et une insertion comme repli (s'il n'y avait pas de mise à jour). Vous pouvez utiliser la clause de mise à jour multi table pour le faire avec une seule mise à jour au lieu d'une sélection suivie d'une mise à jour en passant. Si vous faites à la fois un SELECT et un UPDATE que le INSERT sera certainement plus rapide.