MariaDB comenzando con 10.0.1

La función de estadísticas de tablas independientes del motor se implementó por primera vez en MariaDB 10.0.1 y se habilitó por primera vez para consultas de forma predeterminada en MariaDB 10.4.

Introducción

Antes de MariaDB 10.0, el optimizador MySQL / MariaDB se basaba en motores de almacenamiento (por ejemplo, InnoDB) para proporcionar estadísticas para el optimizador de consultas. Este enfoque funcionó; sin embargo tenía algunas deficiencias:

  • Los motores de almacenamiento proporcionaron estadísticas deficientes (esto se corrigió hasta cierto punto con la introducción de estadísticas persistentes).
  • Las estadísticas se proporcionaron a través de la interfaz del motor de almacenamiento MySQL, que impone muchas restricciones sobre el tipo de datos que se suministran (por ejemplo, no hay forma de obtener datos sobre la distribución de valores en una columna no indexada).
  • Hubo poco control de las estadísticas. No había forma de “fijar” los valores estadísticos actuales, o proporcionar algunos valores por su cuenta, etc.

Las estadísticas de tablas independientes del motor eliminan estas limitaciones.

  • Las estadísticas se almacenan en tablas regulares en el mysql base de datos.
    • es posible que un DBA lea y actualice los valores.
  • Se recopilan / utilizan más datos.

Las estadísticas se almacenan en tres tablas, mysql.table_stats, mysql.column_stats y mysql.index_stats.

El uso o la actualización de los datos de estas tablas está controlado por la variable use_stat_tables. Los posibles valores se enumeran a continuación:

Valor Sentido
‘Nunca’ El optimizador no usa datos de tablas de estadísticas. Predeterminado para MariaDB 10.4.0 y por debajo.
‘complementario’ El optimizador utiliza datos de tablas de estadísticas si el motor de almacenamiento no proporciona el mismo tipo de datos.
‘preferiblemente’ Prefiera los datos de las tablas de estadísticas; si no están disponibles allí, utilice los datos del motor de almacenamiento.
‘complementario_para_queries’ Igual que complementary, pero solo para consultas (para evitar recopilar innecesariamente para ANALYZE TABLE). De MariaDB 10.4.1.
‘preferiblemente_para_queries’ Igual que preferably, pero solo para consultas (para evitar recopilar innecesariamente para ANALYZE TABLE). Disponible y predeterminado desde MariaDB 10.4.1.

Recopilación de estadísticas con la instrucción ANALYZE TABLE

los ANALYZE TABLE La declaración se puede utilizar para recopilar estadísticas de tablas. Por ejemplo:

ANALYZE TABLE table_name;

Cuando el ANALYZE TABLE se ejecuta la instrucción, MariaDB realiza una llamada al motor de almacenamiento de la tabla y el motor de almacenamiento recopila sus propias estadísticas para la tabla. El comportamiento específico depende del motor de almacenamiento. Para InnoDB, consulte Estadísticas persistentes de InnoDB para obtener más información.

Cuando el ANALYZE TABLE se ejecuta la instrucción, MariaDB también puede recopilar estadísticas independientes del motor para la tabla. El comportamiento específico depende del valor de la use_stat_tables variable de sistema. Las estadísticas independientes del motor solo las recopilará el ANALYZE TABLE declaración si se cumple una de las siguientes condiciones:

  • los use_stat_tables la variable del sistema se establece en complementary o preferably.
  • los ANALYZE TABLE declaración incluye el PERSISTENT FOR cláusula.

MariaDB comenzando con 10.4

En MariaDB 10.4 y posteriores, el use_stat_tables la variable del sistema se establece en preferably_for_queries por defecto. Con este valor, las estadísticas independientes del motor se utilizan de forma predeterminada, pero no se recopilan de forma predeterminada. Si desea utilizar estadísticas independientes del motor con la configuración predeterminada, deberá recopilarlas ejecutando el ANALYZE TABLE declaración y especificando el PERSISTENT FOR cláusula. Se recomienda recopilar estadísticas independientes del motor según sea necesario, por lo que normalmente uno no tendrá estadísticas independientes del motor para todos los índices / todas las columnas.

Las estadísticas independientes del motor se recopilan mediante escaneos completos de tabla e índice, y este proceso puede ser bastante costoso.

Recopilación de estadísticas para índices o columnas específicas

La sintaxis de la ANALYZE TABLE La declaración se ha ampliado con el PERSISTENT FOR cláusula. Esta cláusula permite recopilar estadísticas independientes del motor solo para columnas o índices particulares. Esta cláusula también permite recopilar estadísticas independientes del motor, independientemente del valor de la use_stat_tables variable de sistema. Por ejemplo:

ANALYZE TABLE table_name PERSISTENT FOR ALL;

Estadísticas para columnas que utilizan el BLOB y TEXT los tipos de datos no se recopilan. Si se especifica explícitamente una columna que utiliza uno de estos tipos, se devuelve una advertencia.

Ejemplos de recopilación de estadísticas

-- update all engine-independent statistics for all columns and indexes
ANALYZE TABLE tbl PERSISTENT FOR ALL;

-- update specific columns and indexes:
ANALYZE TABLE tbl PERSISTENT FOR COLUMNS (col1,col2,...) INDEXES (idx1,idx2,...);

-- empty lists are allowed:
ANALYZE TABLE tbl PERSISTENT FOR COLUMNS (col1,col2,...) INDEXES ();
ANALYZE TABLE tbl PERSISTENT FOR COLUMNS () INDEXES (idx1,idx2,...);

-- the following will only update mysql.table_stats fields:
ANALYZE TABLE tbl PERSISTENT FOR COLUMNS () INDEXES ();

-- when use_stat_tables is set to 'COMPLEMENTARY' or 'PREFERABLY', 
-- a simple ANALYZE TABLE  collects engine-independent statistics for all columns and indexes.
SET SESSION use_stat_tables='COMPLEMENTARY';
ANALYZE TABLE tbl;

Actualizaciones manuales de tablas de estadísticas

Las estadísticas se almacenan en tres tablas, mysql.table_stats, mysql.column_stats y mysql.index_stats.

Es posible actualizar las tablas de estadísticas manualmente. Uno debe modificar la (s) tabla (s) con instrucciones INSERT / UPDATE / DELETE regulares. Los datos estadísticos se volverán a leer cuando se vuelvan a abrir las tablas. Una forma de forzar la reapertura de todas las tablas es emitir el comando FLUSH TABLES.

Algunos escenarios en los que es posible que deba actualizar las tablas de estadísticas manualmente:

  • Eliminando las estadísticas. Actualmente, el comando ANALYZE TABLE recopilará las estadísticas, pero no hay un comando especial para eliminar las estadísticas.
  • Ejecutando ANALYZE en un servidor diferente. ANALYZE TABLE realiza un escaneo completo de la tabla, lo que puede generar demasiada carga en el servidor. Es posible ejecutar ANALYZE en el esclavo y luego tomar los datos de las tablas de estadísticas en el esclavo y aplicarlos en el maestro.
  • En algunos casos, el conocimiento de la base de datos permite calcular estadísticas manualmente de una manera más eficiente que ANALYZE. Se pueden calcular las estadísticas manualmente y ponerlas en la base de datos.

Ver también

  • Estadísticas del índice

  • Estadísticas persistentes de InnoDB

  • Estadísticas basadas en histogramas

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.