Particionamiento MySQL: ¿Existe una compensación de rendimiento entre el número de particiones y el tamaño de cada partición?

10

Tengo una tabla grande (varios 100 millones de filas) que me gustaría particionar eficientemente. Mi pregunta es si existe una compensación entre el tamaño de la partición y el número de particiones. Según tengo entendido, la mayoría de las consultas en una columna utilizada en la partición serán más rápidas porque la consulta (para la mayoría de las consultas) solo tendrá que buscar dentro de la partición aplicable a la consulta. Por lo tanto, tendría sentido que, para maximizar la eficiencia, debe dividir una tabla grande en el número máximo de particiones, por lo tanto, haciendo que cada partición sea lo más pequeña posible. En el caso de MySQL, esto significa 1024 particiones. Pero, ¿hay algún inconveniente en el rendimiento de tener una gran cantidad de particiones? Es así, ¿cómo se encuentra el número óptimo de particiones?

Nota: Ya existe una pregunta algo similar sobre stackoverflow , pero solo una respuesta, que (desde mi punto de vista) pierde la nota. Así que haré la pregunta a mi manera ... espero que sea más clara

robguinness
fuente

Respuestas:

6

Vamos a compararlos

TAMAÑO DE LA PARTICIÓN

Si tienes lo siguiente:

  • 100 millones de filas en una mesa
  • BTREE indexación
  • Cada página en el BTREE contiene 1024 claves

¿Cómo serían las métricas?

Desde LOG (100000000) / LOG (2) = 26.575424759099, un índice BTREE con 1024 claves por página treenode tendría una altura de árbol de solo 3 (TECHO (LOG (100000000) / LOG (1024))). Con solo tres nodos de páginas, una búsqueda binaria de la clave necesaria en cada treenode accedido resultaría en una poda y aislamiento de aproximadamente 30 claves.

NÚMERO DE PARTICIONES

Si tienes lo siguiente:

  • 100 millones de filas en una mesa
  • BTREE indexación
  • Cada página en el BTREE contiene 1024 claves
  • Crea 1024 pariticiones

Los números serían ligeramente diferentes.

Cada partición debe tener aproximadamente 97656 filas. ¿En qué se convertirían las métricas ahora?

Desde LOG (97656) / LOG (2) = 16.575421065795, un índice BTREE con 1024 claves por página treenode tendría una altura de árbol de solo 2 (CEILING (LOG (97656) / LOG (1024))). Con solo dos nodos de páginas, una búsqueda binaria de la clave necesaria en cada treenode accedido resultaría en una poda y aislamiento de aproximadamente 20 claves.

CONCLUSIÓN

Extender las teclas solo elimina un nivel de árbol, pero esencialmente crea 1024 índices. Las consultas no sabrán la diferencia. El tiempo de búsqueda probablemente sea nominal en el mejor de los casos a favor de las particiones. Sin embargo, asegúrese de que todos los datos estén activos. De lo contrario, puede estar golpeando solo unas pocas particiones, mientras que otras particiones con datos de acceso poco frecuente solo ocupan espacio y nunca se accede con la frecuencia suficiente para justificar la partición . Es posible que tenga que preocuparse por diferentes métricas de rendimiento que son más evidentes (como la desfragmentación interna en XFS , ext3 frente a ext4, etc.) También debe preocuparse por el motor de almacenamiento que está utilizando porque:

  • La indexación de InnoDB sería un poco más complicada en comparación con MyISAM debido a que tiene que administrar un índice agrupado
  • InnoDB realiza una doble escritura de datos en ibdata1, así como en el archivo de registro actual (ib_logfile0 o ib_logfile1)
RolandoMySQLDBA
fuente
1
Gracias, RolandoMySQLDBA, esto es muy interesante. Lo que entiendo de esto es que la partición tendrá una influencia positiva pequeña pero apreciable en la velocidad de consulta, pero puede tener otros efectos negativos, como la fragmentación. Sin embargo, lo que me interesa es cómo determinar el número óptimo de particiones. ¿Debería usar siempre el número máximo permitido (es decir, 1024), o algún otro número podría ser un buen compromiso entre los efectos positivos y negativos? ¿O no es posible analizar este tipo de optimización?
robguinness
Por cierto, este artículo sugiere que la respuesta es un poco más complicada: mysqlperformanceblog.com/2010/12/11/…
robguinness
La respuesta es buena, pero se trata de buscar por clave (o campo indexado). No tengo mucha experiencia con la partición, pero desde mi punto de vista, es útil cuando tienes que hacer un escaneo completo de tabla. En tal caso, escanea solo varias particiones en lugar de toda la tabla.
Cherry