2010-02-07 12 views
10

Suponga una base de datos que consta de 1 GB de datos y 1 GB de datos de índice.Conservación de datos más índice en la memoria - InnoDB vs. MyISAM

Para minimizar el disco IO y maximizar el rendimiento, quiero asignar memoria a MySQL para que todo el conjunto de datos, incluidos los índices, se conserven en la RAM (suponiendo que la máquina tiene RAM en abundancia).

El parámetro InnoDB innodb_buffer_pool_size se utiliza para especificar el tamaño del búfer de memoria que InnoDB utiliza para almacenar en caché los datos y los índices de sus tablas. (Nota: La memoria se utiliza para datos Y índices.)

El parámetro MyISAM key_buffer_size se utiliza para especificar el tamaño del búfer de memoria utiliza MyISAM a los índices de caché de sus tablas. (Nota: La memoria se utiliza SOLAMENTE para los índices.)

Si quiero la base de datos de 2 GB (1 GB de datos y el índice de 1 GB) para encajar en memoria bajo InnoDB, simplemente habría configurar el innodb_buffer_pool_size estar 2GB. Los dos gigabytes contendrán tanto los datos como el índice.

Sin embargo, al establecer la clave MyISAM key_buffer_size en 2GB, ese espacio se usará para el índice, pero no para los datos.

Mis preguntas son:

  • puede "tamaño del búfer de datos" de MyISAM (no los datos de índice) pueden configurar de forma explícita?
  • ¿Cuándo MyISAM leerá los datos de la tabla (excluyendo los datos de índice) del disco y cuándo se leerá desde la memoria?

Respuesta

12
  • Sin MyISAM no tiene caché de datos de uso general. Esto está documentado en la descripción "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.

sistemas operativos modernos, especialmente Linux, tienden a tener subsistemas de memoria virtual muy inteligentes que mantendrán los archivos de acceso frecuente en la caché de páginas, por lo que el disco I/O es mantenerse al mínimo cuando el conjunto de trabajo se ajusta a la memoria disponible.

  • Para responder a su segunda pregunta: nunca.

Es importante no caer en "buffer sobredimensionamiento" también para las distintas variables de MyISAM como read_buffer_size, read_rnd_buffer_size, sort_buffer_size, join_buffer_size, etc, ya que algunos se asigna de forma dinámica, por lo que más grande no siempre significa más rápido - y, a veces incluso puede ser más lento: consulte este post en mysqlperformanceblog para ver un caso muy interesante.

Si está en 5.1 en una plataforma posix, es posible que desee comparar myisam_use_mmap en su carga de trabajo, se supone que ayuda a casos de alta contención reduciendo la cantidad de llamadas malloc().

Cuestiones relacionadas