Quelle est la façon la plus efficace de mettre à jour les requêtes de mise à jour dans MySQL?

dba.stackexchange https://dba.stackexchange.com/questions/28282

  •  31-10-2019
  •  | 
  •  

Question

J'écris une application qui doit éliminer un grand nombre de mises à jour de la base de données pendant une longue période, et je suis resté coincé sur la façon d'optimiser la requête. Actuellement j'utilise INSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE, qui fonctionne pour laver toutes les valeurs en une seule requête, mais exécute de manière atroce lentement sur de grandes tables. Je n'ai jamais vraiment besoin d'insérer des lignes.

D'autres approches que j'ai vues sont à mettre à jour en utilisant SET value = CASE WHEN... (Ce qui serait difficile à générer en raison de la façon dont je construis les requêtes, et je ne suis pas sûr des performances de CASE pour des centaines / milliers de clés) et simplement plusieurs mises à jour concaténées. Est-ce que l'un ou l'autre serait plus rapide que ma méthode actuelle?

Cela me déroute que, pour autant que je sache, il n'y a pas de moyen idiomatique et efficace de le faire dans MySQL. S'il n'y a vraiment pas de moyen, c'est plus rapide que ON DUPLICATE KEY, cela vaut-il la peine de passer à PostgreSQL et d'utiliser son UPDATE FROM syntaxe?

Toutes les autres suggestions sont également grandement appréciées!

EDIT: Voici l'une des tables qui se mettent fréquemment à jour. J'ai supprimé les noms de colonnes car ils ne sont pas pertinents.

CREATE TABLE IF NOT EXISTS `table` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` bigint(20) unsigned NOT NULL DEFAULT '0',
  `b` bigint(20) unsigned NOT NULL DEFAULT '0',
  `c` enum('0','1','2') NOT NULL DEFAULT '0',
  `d` char(32) NOT NULL,
  -- trimmed --
  PRIMARY KEY (`id`),
  KEY `a` (`a`),
  KEY `b` (`b`),
  KEY `c` (`c`),
  KEY `d` (`d`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top