Estoy ejecutando un servidor MySQL 5.5 en mi estación de trabajo para el análisis de datos científicos y me pregunto cómo configurar MySQL para aprovechar al máximo el rendimiento. Los tipos de consulta que normalmente ejecuto implican uniones de 10-20 tablas y pueden ejecutarse durante bastante tiempo, de uno a varios minutos, sin ninguna excepción. Solo muy pocos usuarios acceden a la base de datos al mismo tiempo (5 es el máximo). Moví el servidor de un Lenovo Thinkpad T61 con un núcleo dual de 2.2 GHz y 4 GB de RAM a la siguiente máquina nueva con componentes seleccionados a mano:
- Intel i7 3770, 4x 3.4 GHz (funcionando a 4x3.7 GHz)
- Chipset Z77
- 16 GB de RAM DDR3 1600
- Windows 7 Prof 64 bits
- El servidor Windows y MySQL se ejecuta en una unidad SSD Intel 520 series.
Las primeras pruebas (ejecutando la misma consulta en ambas máquinas) mostraron una mejora definitiva en la velocidad de la nueva, pero las consultas aún requieren mucho tiempo y esperaba un mayor impulso. Las consultas en cuestión están bastante bien optimizadas, es decir, todas las tablas tienen una clave adecuada que también se utiliza a partir de "explicar extendido".
Ahora a mi configuración actual de MySQL: Primero debo mencionar que me mudé de MyISAM a Innodb hace mucho tiempo.
Algunos de mis ajustes my.ini (es decir, desviaciones de la configuración predeterminada):
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system. Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M
general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries
Me gustaría saber si alguien sugeriría cambios en los números anteriores o incluso configuraciones adicionales que no conozco.
Agradecería cualquier comentario útil.
Steve
EDITAR: Tengo dos consultas que involucran combinaciones en 10-20 tablas y las ejecuté en mi computadora portátil Lenovo y la nueva PC. La consulta # 1 tomó 3m36s en la nueva máquina frente a 9m11s en la computadora portátil; La consulta # 2 tomó 22.5s en la estación de trabajo frente a 48.5s en la computadora portátil. Por lo tanto, la velocidad de ejecución mejoró aproximadamente por el factor 2-2.5. En la estación de trabajo, ni siquiera se utilizó el 50% de la RAM. La carga promedio de la CPU en los cuatro núcleos (según lo informado por el Administrador de tareas de Windows) fue solo del 13%. La carga por núcleo (según lo informado por Core Temp) fue de aproximadamente 25-40% para UN núcleo, mientras que fue <= 10% para los demás, lo que indica que MySQL no utiliza múltiples núcleos para una sola consulta .