web-dev-qa-db-fra.com

Comment créer une base de données MySQL complètement en mémoire?

J'ai remarqué que mon serveur de base de données prend en charge le moteur de base de données Memory. Je souhaite que la base de données que j'ai déjà exécutée avec InnoDB soit entièrement exécutée en mémoire pour améliorer les performances.

Comment je fais ça? J'ai exploré PHPMyAdmin et je ne trouve pas de fonctionnalité de "moteur de changement".

36
John Hoffman

En supposant que vous compreniez les conséquences de l’utilisation du moteur MEMORY, comme indiqué dans les commentaires, et ici , ainsi que d’autres que vous trouverez en cherchant (sécurité sans transaction, problèmes de verrouillage, etc.) - vous pouvez procéder comme suit :

Les tables MEMORY étant stockées différemment qu'InnoDB, vous devrez utiliser une stratégie d'exportation/importation. Commencez par vider chaque table séparément dans un fichier en utilisant SELECT * FROM tablename INTO OUTFILE 'table_filename'. Créez la base de données MEMORY et recréez les tables que vous utiliserez avec cette syntaxe: CREATE TABLE tablename (...) ENGINE = MEMORY;. Vous pouvez ensuite importer vos données en utilisant LOAD DATA INFILE 'table_filename' INTO TABLE tablename pour chaque table.

20
PinnyM

Il est également possible de placer le répertoire de données MySQL dans un tmpfs en accélérant ainsi les appels en écriture et en lecture de la base de données. Ce n'est peut-être pas le moyen le plus efficace de le faire, mais vous ne pouvez parfois pas simplement changer le moteur de stockage. 

Voici mon entrée fstab pour mon répertoire de données MySQL

none            /opt/mysql/server-5.6/data  tmpfs   defaults,size=1000M,uid=999,gid=1000,mode=0700          0       0

J'ai aussi écrit un article qui explique la configuration plus en détail. J'utilise cette configuration pour les tests de base de données.

http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/

Vous pouvez également consulter le paramètre innodb_flush_log_at_trx_commit = 2. Cela accélérera peut-être suffisamment votre MySQL. 

innodb_flush_log_at_trx_commit modifie le comportement de vidage du disque mysql. Lorsqu'il est défini sur 2, il videra uniquement le tampon toutes les secondes. Par défaut, chaque insertion provoquera un vidage et causera donc plus de charge IO.

14
Jotschi

Memory Engine n'est pas la solution que vous recherchez. Vous perdez tout ce pour quoi vous êtes allé dans une base de données (c.-à-d. ACID).

Voici quelques meilleures alternatives:

  1. N'utilisez pas de jointures - très peu d'applications volumineuses le font (par exemple, Google, Flickr, NetFlix), parce que cela craint les grands ensembles de jointures. 

Un LEFT [OUTER] JOIN peut être plus rapide qu'une sous-requête équivalente car le serveur pourrait peut-être mieux l’optimiser, ce qui n’est pas le cas spécifique au serveur MySQL seul.

- Le manuel MySQL

  1. Assurez-vous que les colonnes sur lesquelles vous interrogez ont des index. Utilisez EXPLAIN pour confirmer qu'ils sont utilisés.
  2. Utilisez et augmentez votre Query_Cache et votre espace mémoire pour vos index afin de les obtenir en mémoire et de stocker des recherches fréquentes.
  3. Dénormaliser votre schéma, en particulier pour les jointures simples (c'est-à-dire obtenir fooId de barMap).

Le dernier point est la clé. J'aimais les jointures, mais je devais ensuite les exécuter sur quelques tables de 100 millions de lignes ou plus. Pas bien. Mieux vaut insérer les données que vous joignez dans cette table cible (si ce n’est pas trop) et interroger des colonnes indexées et vous obtiendrez votre requête en quelques ms.

J'espère que ces aide.

9
Joseph Lust

Si votre base de données est suffisamment petite (ou si vous ajoutez suffisamment de mémoire), votre base de données s'exécutera effectivement en mémoire car vos données seront mises en cache après la première demande. 

La modification des définitions de table de base de données pour utiliser le moteur de mémoire est probablement plus compliquée que nécessaire.

Si vous avez assez de mémoire pour charger les tables en mémoire avec le moteur MEMORY, vous en avez assez pour ajuster les paramètres innodb de manière à tout mettre en cache.

7
Kevin Bedell

"Comment puis-je faire cela? J'ai exploré PHPMyAdmin et je ne trouve pas de fonctionnalité de" moteur de changement "."

En réponse directe à cette partie de votre question, vous pouvez émettre un ALTER TABLE tbl engine=InnoDB; et recréer la table dans le moteur approprié.

4
Seaux

À la place du moteur de stockage en mémoire, on peut envisager MySQL Cluster. Il est réputé offrir des performances similaires, mais prendre en charge les opérations sur disque pour plus de durabilité. Je ne l'ai pas essayé, mais cela semble prometteur (et en développement depuis plusieurs années).

Vous pouvez trouver la documentation officielle de MySQL Cluster ici.

2
Jice

Pensées supplémentaires:

Ramdisk - Définition du lecteur temporaire utilisé par MySQL comme disque RAM, très facile à configurer.

memcache - le serveur memcache est facile à configurer, utilisez-le pour stocker les résultats de vos requêtes pendant une durée X.

0
Mike Q