Haute performance MySQL pour de nombreux SELECT / INSERT / UPDATEs / DELETEs

9

Je crée un module où chaque utilisateur obtient souvent un enregistrement dans une table pendant 10 à 300 secondes.

À l'expiration du délai, un enregistrement est supprimé. Le cas est le suivant: il y aura beaucoup d'utilisateurs et les enregistrements changeront très souvent - comment cela affectera les performances de l'application pour cette table, car les enregistrements changeront très souvent et je me demande si mysql est d'accord? Comme les index vont et viennent, les données changent comme 200 fois / secondes pour cette table particulière. Peut-être que je choisis une mauvaise solution pour ce genre de travail. Aucune suggestion ?

Je vous remercie!

Aivaras
la source
2
Avez-vous essayé de stocker des données dans memcache, puis de les vider en une seule transaction toutes les quelques secondes?
3
"les données changent comme 200 fois / secondes pour cette table particulière" Je pense que la ligne indique que ces données doivent être conservées en mémoire, la durée de vie pendant laquelle elles doivent persister est minuscule donc ne devrait probablement pas aller sur le disque?
Les index vont et viennent? Je ne vois aucune raison pour laquelle vous auriez besoin de créer et de supprimer des index très souvent.
Barry Brown

Réponses:

3

Une chose à prendre en considération est la façon dont MySQL utilise les tampons pour ses principaux moteurs de stockage: InnoDB et MyISAM .

Ce qui se trouve dans la mémoire cache diffère considérablement entre ces moteurs de stockage.

InnoDB met en cache les pages de données et d'index. Ils sont chargés dans le pool de tampons InnoDB, qui est dimensionné par innodb_buffer_pool_size .

MyISAM ne met en cache que les pages d'index et elles sont chargées dans le cache de clés (tampon de clés), qui est dimensionné par key_buffer_size .

Vous devez utiliser information_schema.tables pour obtenir les tailles de données et d'index occupées sur le disque afin de dimensionner correctement le pool de mémoire tampon InnoDB et le cache de clés MyISAM .

En fonction de la quantité de données dont vous disposez et du temps dont vous disposez, vous pouvez réchauffer les caches comme suit:

Pour chaque table TableT

  • aller à chaque index NDX
  • pour chaque indice NDX
    • exécuter SELECT chaque colonne dans NDX, au moins une colonne non indexée dans TableT à partir de TableT

En faisant cela, vous garantissez que chaque page de données et d'index est lue au moins une fois. Ils seront assis dans la cache. Ce concept est pratiqué, en partie et en principe, par Percona . Percona a intégré ce concept dans mk-slave-prefetch . Ce que fait ce programme est

  • lire les journaux de relais sur un esclave avant que l'esclave ne traite le SQL
  • prendre une instruction SQL du journal de relais et la convertir en SELECT en utilisant les clauses WHERE, GROUP BY et ORDER BY comme guide pour choisir les index
  • exécuter l'instruction SELECT provenant de SQL converti

Cela oblige l'esclave à disposer de 99,99% des données nécessaires à l'esclave pour traiter le SQL rapidement. Cela permet également à l'esclave de se préparer au cas où vous basculer manuellement vers l'esclave et de le promouvoir en maître DONT LES CACHES SONT JUSTE À PROPOS DU MÊME QUE LE MAÎTRE QUE VOUS AVEZ ÉCHOUÉ.

CONCLUSION

Rien de mieux que d'avoir des caches prêts, désireux et capables d'être utilisés dans un environnement de INSERTS, MISES À JOUR et SUPPRESSIONs lourds.

Essaie !!!

CAVEAT

Avec la naissance de produits comme memcached, certains se sont éloignés de la nécessité d'effectuer un réglage correct de MySQL. Certes, de nombreux sites bénéficient de l'augmentation de la récupération de données fournie par le contrôle du comportement de mise en cache des données, comme les développeurs l'ont rapidement vu avec memcached. De nombreux autres sites, simplement en changeant de moteur de stockage ou en configurant correctement MySQL, ont réalisé les mêmes avantages en termes de performances. Avant d'abandonner la base de données et de l'utiliser strictement comme référentiel, profitez au maximum de votre base de données. Suivez la diligence raisonnable et vous pourriez être agréablement surpris de ce que MySQL fera pour vous.

RolandoMySQLDBA
la source
5

Si c'est une mauvaise solution, cela dépendra de beaucoup de choses. Ces données doivent-elles être persistantes? Sinon, une solution qui conserve simplement ces données en mémoire fonctionnerait mieux.

«Beaucoup d'utilisateurs» n'aide vraiment personne. MySQL ira très probablement bien si "beaucoup" signifie quelques centaines. (Bien que cela dépende de ce que votre base de données doit gérer d'autre, plusieurs milliers devraient très probablement fonctionner aussi.)

Après tout, peu importe si vous écrivez ces enregistrements pour les conserver ou les supprimer après quelques secondes à quelques minutes. La suppression ne fait que deux opérations sur une. Et MySQL peut à coup sûr gérer une très grande quantité de création et de suppression d'enregistrements. Assurez-vous d'utiliser un index simple pour retrouver ces enregistrements à supprimer.

Mais sans chiffres réels et quelques informations sur le matériel utilisé par votre serveur de base de données, cela ne peut pas être répondu avec beaucoup de précision.

La meilleure chose serait d'écrire une petite application, qui simule simplement la quantité de charge que vous pensez que vous obtiendrez sans faire beaucoup de traitement réel, déposez simplement beaucoup d'enregistrements sur le serveur, supprimez-les, au même rythme exécutez certaines requêtes comme le le reste de votre programme serait généré. Jetez un œil à votre serveur et voyez si cela l'affecte de quelque manière que ce soit.

Je ne sais pas, mais il existe des options à définir pour MySQL qui lui permettraient de mettre en cache une table en mémoire complètement, ce qui est de toute façon possible dans de nombreuses situations et vous n'aurez probablement pas à changer grand-chose. Mais si vous parlez d'un très grand nombre d'utilisateurs et d'enregistrements, vous pouvez peut-être modifier quelques paramètres pour optimiser la mise en cache pour vos besoins particuliers.

thorsten müller
la source
4
+1 pour avoir suggéré une solution qui conserve les données en mémoire.
3

Voici une idée folle . Cela implique des hypothèses et des pratiques pas toujours recommandées (comme la mise à jour d'une clé) - J'obtiendrai beaucoup de points négatifs pour suggérer cela, mais c'est parti ...

En supposant que vous avez un volume de lignes et un volume de suppressions très élevés, vous pouvez améliorer les performances de suppression en créant 2 partitions sur votre table. Les partitions différeraient par le premier chiffre de la clé. Exemple:

La valeur de clé 1123234441 est pour les lignes actives et la valeur de clé: 9123234441 est pour les lignes inactives (le premier chiffre de cet exemple est utilisé comme suit: 1 = actif, 9 = inactif).

Maintenant, lorsque l'utilisateur supprime une ligne, vous ne supprimez pas physiquement la ligne, vous mettez à jour la clé (Ouch!), Cela déplacerait automatiquement la ligne vers la partition des lignes inactives.

Bien sûr, vous devez restreindre vos sélections pour lire les données de la partition active uniquement. Maintenant, la partie intéressante est que la suppression de la partition des lignes inactives est extrêmement rapide.

Comme je l'ai dit plus tôt, cela fonctionne si vous n'avez qu'une seule table. Je n'ai pas testé cela, c'est donc juste une approche théorique, mais j'ai connu la vitesse de chute des partitions et c'est incroyablement rapide.

Pour améliorer vos sélections, utilisez une indexation appropriée et pour améliorer les insertions, minimisez la taille des lignes et le nombre d'index (cette déclaration est très générique ...)

Pour une référence, voir: http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html J'espère que cela vous aidera.

Aucune chance
la source
2
Je ne suis pas sûr, si cela a du sens pour ce problème spécifique (je pense toujours que mysql mettra tout en cache et que ces enregistrements ne verront probablement jamais de disque). Mais +1 pour avoir souligné une technique d'optimisation intéressante que je ne connaissais pas encore.