Mon cluster MySQL: Ver 5.6.30-76.3-56 for debian-linux-gnu on x86_64 (Percona XtraDB Cluster (GPL), Release rel76.3, Revision aa929cb, WSREP version 25.16, wsrep_25.16)
INSERT INTO SELECT prend beaucoup de temps sur le cluster
J'ai une requête SQL compliquée qui insère environ 36k lignes dans une table avec cette syntaxe:
INSERT INTO `sometable` (SELECT ...);
La sélection est un peu compliqué mais pas lent (0.0023s) mais l'insertion prend environ 40-50s. La table n'est pas utilisée lorsque j'insère les lignes.
Mes questions sont les suivantes:
- Puis-je accélérer en quelque sorte?
- L'insertion lente provoque des problèmes de verrouillage sur les autres tables (à cause de select)
- Ce workflow est une bonne ou une mauvaise pratique? Est-ce qu'il y a mieux?
Merci
MISE À JOUR:
Le schéma de la table:
CREATE TABLE `sometable` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned DEFAULT NULL,
`a` varchar(255) DEFAULT NULL,
`b` smallint(6) unsigned DEFAULT NULL,
`c` smallint(6) unsigned DEFAULT NULL,
`d` smallint(6) unsigned DEFAULT NULL,
`e` smallint(6) unsigned DEFAULT NULL,
`f` varchar(255) DEFAULT '',
`country_id` int(10) unsigned DEFAULT NULL,
`city_id` int(10) unsigned DEFAULT NULL,
`g` smallint(6) unsigned DEFAULT NULL,
`h` smallint(6) unsigned DEFAULT NULL,
`i` smallint(6) unsigned DEFAULT NULL,
`j` smallint(6) unsigned DEFAULT NULL,
`k` smallint(6) unsigned DEFAULT NULL,
`l` varchar(3) DEFAULT NULL,
`m` varchar(3) DEFAULT NULL,
`n` text,
`o` varchar(255) DEFAULT NULL,
`p` varchar(32) DEFAULT NULL,
`q` varchar(32) DEFAULT NULL,
`r` varchar(32) DEFAULT NULL,
`s` time DEFAULT NULL,
`t` time DEFAULT NULL,
`u` text,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `country_id` (`country_id`),
KEY `city_id` (`city_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MAJ2:
Lorsque je tente d'exécuter la requête je reçois une erreur certains cas:
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
MA SOLUTION:
Voici ma solution finale si quelqu'un intéressé par: gist
Le principal problème est que si je remplis mytable
les autres requêtes sont bloquées et le cluster a sérieux problèmes de performance. Dans cette solution, je crée une table temporaire et la remplis avec des données en mode "dirty sale", puis je copie ces données en mytable
en morceaux, donc cela prend un peu plus de temps mais il n'y a pas de problèmes de performance et pas les requêtes.
esprit partageant avec nous l'instruction 'CREATE TABLE' de votre table? (Inclure uniquement les éléments importants, tels que les clés, les colonnes indexées, les index, etc.) –
Veuillez lire ce document http://meta.stackoverflow.com/a/271056/ en particulier la partie sur les performances des requêtes. Alors s'il vous plaît [modifier] votre question. –
Etes-vous sûr que votre opération 'SELECT' est vraiment rapide? Lisez ceci: http://meta.stackoverflow.com/a/271056/ –