Ajuste (y comprensión) table_cache en mySQL

18

Ejecuté el excelente script de ajuste de rendimiento de MySQL y comencé a trabajar con las sugerencias. Uno con el que me encontré fue

TABLE CACHE
Valor actual de table_cache = 4096 tablas Tiene un total de 1073 tablas. Tienes 3900 mesas abiertas. La tasa de aciertos de table_cache actual es del 2%, mientras que el 95% de la caché de su tabla está en uso. Probablemente deberías aumentar tu table_cache

Comencé a leer en la tabla_caché pero encontré que la documentación de MySQL era bastante escasa. Dicen que aumentar el table_cache"si tienes memoria". Lamentablemente, la table_cachevariable se define como "El número de tablas abiertas para todos los subprocesos".

¿Cómo cambiará la memoria utilizada por MySQL si aumento esta variable? ¿Cuál es un buen valor, para configurarlo?

jotango
fuente

Respuestas:

16

De la documentación de MySQL

Por ejemplo, para 200 conexiones simultáneas en ejecución, debe tener un tamaño de caché de tabla de al menos 200 × N, donde N es el número máximo de tablas por unión en cualquiera de las consultas que ejecuta. También debe reservar algunos descriptores de archivo adicionales para tablas y archivos temporales.

Entonces, si en su aplicación tiene una consulta que une 4 tablas y desea poder manejar 200 conexiones concurrentes, en base a esa declaración, debe tener table_cache de al menos 800.

En cuanto al uso de la memoria, no tengo esos números, sospecho que dependerá del tamaño de las tablas que está almacenando en caché.

ManiacZX
fuente
Gracias por la anotación. Tengo un poco de miedo de aumentar mi número de table_cache sin saber cómo cambiará el uso de RAM. La memoria RAM de la máquina ya está llena.
jotango
¿Está seguro de que la memoria está realmente agotada o solo la memoria ha sido ocupada por buffers / cache? Ejecute "free -m" y mire la segunda línea (- / + buffers / cache), esta es una representación más precisa de su uso de memoria en mb. Vea las respuestas en serverfault.com/questions/73189/… y serverfault.com/questions/9442/…
ManiacZX
Sí, realmente está usando la memoria. Ayer se cambió, lo que es realmente malo para una producción db. Pedí una actualización de RAM de HP hoy.
jotango
Para aquellos que vienen a esto ahora, esta respuesta no es precisa para MySQL 5.1+. ahora se refiere a table_open_cachecuando miras los documentos. Vea la respuesta de @MarkR al mirartable_cache
Jason
3

Debe monitorear la variable Opened_Tables y ver qué tan rápido aumenta. Si es significativamente más rápido de lo que crea nuevas tablas (incluidas las temporales), entonces el caché de su tabla puede ser demasiado pequeño.

Table_Cache siempre debería, bueno, sobre todo de todos modos, ser significativamente mayor que el número total de tablas en el servidor. De lo contrario, seguirá abriendo y cerrando mesas.

No puedo ver cómo podría obtener una tasa de aciertos de caché del 2%, a menos que esté midiendo el tiempo justo después de reiniciar un servidor o usando mucho FLUSH TABLES (en relación con el número de consultas). Normalmente, la tasa de aciertos de la memoria caché de la tabla debe ser del 99,9%; de lo contrario, el rendimiento no funcionará.

No hagas una TABLAS DE ENJUAGUE si puedes evitarla, explota el caché.

Abrir tablas es costoso ya que necesita leer el archivo FRM. En MyISAM es significativamente peor (que otros motores), ya que cuando cierra una tabla, también arroja todos los bloques en el caché de claves que provienen de sus índices. Entonces, cerrar una tabla volca sus índices de la caché de claves == ¡no es bueno! Otros motores mantienen los bloques almacenados en caché pero aún necesitan releer los metadatos y asignar algunas estructuras.

MarkR
fuente