2010-02-07 12 views
10

Supposons une base de données constituée de 1 Go de données et de 1 Go de données d'index. Pour minimiser les E/S du disque et donc optimiser les performances, je souhaite allouer de la mémoire à MySQL afin que l'intégralité du jeu de données, y compris les index, puisse être stockée dans la RAM (en supposant que la machine dispose de RAM).Conservation des données et des données d'index en mémoire - InnoDB vs. MyISAM

Le paramètre InnoDB innodb_buffer_pool_size permet de spécifier la taille du tampon de mémoire qu'InnocD utilise pour mettre en cache les données et les index de ses tables. (Remarque: La mémoire est utilisée pour les données ET index.)

Le paramètre MyISAM key_buffer_size est utilisé pour spécifier la taille de la mémoire tampon MyISAM utilise les index de cache de ses tables. (Note: La mémoire est utilisée SEULEMENT pour les index.)

Si je veux la base de données de 2 Go (1 Go de données et l'indice 1 Go) pour entrer dans la mémoire sous InnoDB, je voudrais simplement configurer le innodb_buffer_pool_size être 2GB. Les deux gigaoctets contiendront à la fois les données et l'index. Toutefois, lors de la définition de la clé MyISAM key_buffer_size à 2GB, cet espace sera utilisé pour l'index, mais pas pour les données.

Mes questions sont les suivantes:

  • peut "la taille de la mémoire tampon de données" de MyISAM (pas de données d'index) être configuré explicitement?
  • Quand MyISAM lit-il les données de table (à l'exclusion des données d'index) à partir du disque et quand lit-il de la mémoire?

Répondre

12
  • Aucun MyISAM n'a pas de cache de données à usage général. Ceci est documenté dans la description « key_buffer_size » de the official documentation: This is because MySQL relies on the operating system to perform file system caching for data reads, so you must leave some room for the file system cache.

OSes modernes, en particulier Linux, ont tendance à avoir très intelligents sous-systèmes de mémoire virtuelle qui gardera les fichiers fréquemment utilisés dans le cache de page, donc E/S disque est maintenu au strict minimum lorsque l'ensemble de travail tient dans la mémoire disponible.

  • Donc, pour répondre à votre deuxième question: jamais.

Il est important de ne pas tomber dans « tampon surdimensionnement » trop pour les différentes variables MyISAM telles que record_buffer, read_rnd_buffer_size, sort_buffer_size, join_buffer_size, etc comme certains sont alloués dynamiquement, de manière plus ne signifie pas toujours plus rapide - et parfois il peut même être plus lent - voir ce post sur mysqlperformanceblog pour un cas très intéressant. Si vous utilisez la version 5.1 sur une plate-forme Posix, vous pouvez utiliser la référence myisam_use_mmap pour votre charge de travail. Elle est censée aider les cas de contention élevés en réduisant la quantité d'appels malloc().