Si hay algo que puedo decir sobre MySQL es que InnoDB, su motor de almacenamiento transaccional (compatible con ACID), es de hecho multiproceso. ¡Sin embargo, es tan multiproceso como lo CONFIGURAS! Incluso "listo para usar", InnoDB funciona muy bien en un solo entorno de CPU, dada su configuración predeterminada. Para aprovechar las capacidades de subprocesamiento múltiple de InnoDB, debe recordar activar muchas opciones.
innodb_thread_concurrency establece el límite superior en el número de hilos concurrentes que InnoDB puede mantener abiertos. El mejor número de ronda para establecer es (2 X Número de CPU) + Número de discos. ACTUALIZACIÓN : Como aprendí de primera mano de la Conferencia de Percona NYC, debe establecer esto en 0 para alertar a InnoDB Storage Engine para que encuentre la mejor cantidad de subprocesos para el entorno en el que se está ejecutando.
innodb_concurrency_tickets establece el número de subprocesos que pueden evitar la comprobación de concurrencia con impunidad. Una vez alcanzado ese límite, la comprobación de concurrencia de subprocesos vuelve a ser la norma.
innodb_commit_concurrency establece el número de transacciones concurrentes que pueden confirmarse. Dado que el valor predeterminado es 0, no establecer esto permite que cualquier número de transacciones se confirme simultáneamente.
innodb_thread_sleep_delay establece el número de milisegundos que un subproceso InnoDB puede estar inactivo antes de volver a ingresar en la cola InnoDB. El valor predeterminado es 10000 (10 segundos).
innodb_read_io_threads e innodb_write_io_threads (ambos desde MySQL 5.1.38) asignan el número especificado de hilos para lecturas y escrituras. El valor predeterminado es 4 y el máximo es 64.
innodb_replication_delay impone un retraso de subproceso en un esclavo si se alcanza innodb_thread_concurrency.
innodb_read_ahead_threshold permite lecturas lineales del número establecido de extensiones (64 páginas [página = 16K]) antes de cambiar a lectura asíncrona.
El tiempo se me escaparía si nombrara más opciones. Puede leer sobre ellos en la documentación de MySQL .
La mayoría de las personas desconocen estas características y están bastante satisfechas con InnoDB simplemente haciendo transacciones que cumplen con ACID. Si modifica cualquiera de estas opciones, lo hace bajo su propio riesgo.
He jugado con MySQL 5.5 Multiple Buffer Pool Instances (162GB en 9 instancias de agrupaciones de búfer) y he intentado que los datos se particionen automáticamente en la memoria de esta manera. Algunos expertos dicen que esto debería brindarle una mejora del rendimiento del 50%. Lo que obtuve fue una tonelada de bloqueo de hilo que realmente hizo que InnoDB se arrastrara. Cambié a 1 búfer (162 GB) y todo volvió a estar bien en el mundo. Supongo que necesita expertos de Percona a su disposición para configurar esto. Mañana estaré en la Conferencia Percona MySQL en Nueva York y preguntaré sobre esto si se me brinda la oportunidad.
En conclusión, InnoDB se comporta bien ahora en un servidor de CPU múltiple dada su configuración predeterminada para operaciones multiproceso. Ajustarlos tiene mucho cuidado, gran paciencia, excelente documentación y excelente café (o Red Bull, Jolt, etc.).
¡Buenos días, buenas noches y buenas noches!
ACTUALIZACIÓN 2011-05-27 20:11
Regresé de la Conferencia Percona MySQL en Nueva York el jueves. Que conferencia. Aprendí mucho, pero obtuve una respuesta que investigaré sobre InnoDB. Ronald Bradford me informó que establecer innodb_thread_concurrency en 0 permitirá que InnoDB decida el mejor curso de acción internamente con concurrencia de hilos. Voy a experimentar más con esto en MySQL 5.5.
ACTUALIZACIÓN 2011-06-01 11:20
En lo que respecta a una consulta larga, InnoDB es compatible con ACID y funciona muy bien usando el Control de concurrencia de MultiVersion . Las transacciones deben poder llevar niveles de aislamiento (lecturas repetibles por defecto) que eviten que otros bloqueen el acceso a los datos.
En cuanto a los sistemas multinúcleo, InnoDB ha recorrido un largo camino. En el pasado, InnoDB no podía funcionar bien en un entorno multinúcleo. Recuerdo tener que ejecutar varias instancias de mysql en un solo servidor para obtener los múltiples núcleos para distribuir los múltiples procesos de mysqld entre las CPU. Esto ya no es necesario, gracias a Percona, y más tarde a MySQL (eh, Oracle, diciendo que todavía me da asco), ya que han desarrollado InnoDB en un motor de almacenamiento más maduro que puede acceder a los núcleos con simplicidad sin demasiados ajustes. La instancia actual de InnoDB hoy puede funcionar bien en un único servidor central.