Accélérez les insertions MySQL avec des partitions sur MyISAM avec une clé unique

9

J'ai une grande table MyISAM (~ 30 millions de lignes). À un moment donné, je l'ai changé au format de ligne fixe, alors maintenant la table prend ~ 40 Go sur le disque et 2 Go pour les index. La table a un index unique et il y a 100 requêtes d'insertion sur la mise à jour de clé en double par seconde. À mesure que la table grandit, ces inserts deviennent de plus en plus lents.

Je ne suis pas sûr, mais les partitions m'aideront-elles à accélérer les insertions?

d0rc
la source

Réponses:

1

Tout d'abord, les écritures simultanées ne sont certainement pas une option pour le stockage MyISAM. Chacun d'eux verrouillera une table entière (sauf pour la lecture dans certains cas). Si InnoDB ne vous convient pas bien, essayez TokuDB. Mais il sera plus lent que MyISAM en raison de la nature transactionnelle du moteur TokuDB (et InnoDB bien sûr) (vous devez écrire les mêmes données au moins deux fois: journal et fichiers de données). De plus, si votre serveur tombe en panne un jour, vous attendez des heures que votre table MyISAM 40 Go répare.

Si vous voulez toujours charger des données dans vos tables MyISAM et que vous voulez le faire rapidement, je peux recommander d'utiliser LOAD DATA INFILEau lieu d'inserts. C'est le moyen le plus rapide pour charger de gros volumes de données dans une table. Et oui, les index ralentiront les performances d'insertion de manière exponentielle.

Un mot sur les partitions: les instructions INSERT dans MySQL ne prennent pas en charge l'élagage, donc toutes vos partitions seront analysées sur chaque instruction pour une correspondance d'index unique. De plus, toutes les partitions seront verrouillées jusqu'à la fin de l'insertion.

Loup gris
la source
Un moteur plus intéressant: code.facebook.com/posts/190251048047090/…
GreyWolf
0

Ces requêtes d'insertion sont-elles simultanées ou proviennent-elles du même processus? S'ils sont simultanés, il est préférable d'utiliser le stockage InnoDB pour cette table car MyISAM verrouille la table entière et InnoDB utilise des verrous de ligne. Si le passage à un autre stockage n'est pas une option, vous pouvez essayer l'instruction INSERT DELAYED et un certain nombre d'autres optimisations d'insertion . Le partitionnement n'aidera que si vous placez différentes partitions sur différents disques physiques.

Alex
la source
Ces insertions sont simultanées. Mais InnoDB est trop lent à «insérer lors de la mise à jour des clés en double», ce n'est donc pas une option. Pour autant que je sache, IO n'est pas un goulot d'étranglement - la quantité de RAM >> taille des tables, y compris les index et la mise en cache est activée. Je pense que le problème se situe quelque part dans les verrous internes de mysql ou quelque chose.
d0rc
INSERT DELAYED ne doit être utilisé que pour les instructions INSERT qui spécifient des listes de valeurs. Le serveur ignore DELAYED pour les instructions INSERT ... SELECT ou INSERT ... ON DUPLICATE KEY UPDATE.
llazzaro
"InnoDB est trop lent" - avez-vous essayé de le régler un peu? Les paramètres par défaut sont assez médiocres.
rvs