Colección de citas famosas - Colección de versos - ¿Es necesario crear un índice en línea? Hay tres formas de agregar índices en diferentes versiones de MySQL: (1) Copiar la tabla, que es la primera forma de crear índices admitidos por InnoDB. Como sugiere el nombre, la creación de índices se logra copiando una tabla temporal. Cree una nueva tabla temporal con el nuevo índice, copie todos los datos de la tabla original a la tabla temporal y luego cámbiele el nombre para completar la operación de creación del índice. Este método crea un índice mientras la tabla original es legible. Pero consumirá el doble de espacio de almacenamiento. (2) Modo local Este es MySQL nativo 5::MySQL _ alter _ table(); // Determina si la operación actual se puede implementar en el lugar. Las que no se pueden cambiar en el lugar son ://1: :add _ index() ...//Crear la fila 0 del diccionario de datos de índice merge::wait _ while _ table _ is _ used() //Después de crear el índice, realice la limpieza final::MySQL _ alter _ table(); //1: :row_log_allocate();row_log_t*log=(row_log_t*)&buf[2*SRV_sort_buf_size];// Indica que el estado actual del índice es creación en línea, luego // La operación DML en El índice se escribirá en el registro de filas sin actualizar dict_index_set_Online_status(index, Online_index_creation);...//3::row_merge en el índice _build_index();...//Después de las operaciones de lectura, clasificación e inserción del nuevo Se completa el índice agrupado // Ingrese la diferencia real entre Online e Inplace. También es la esencia de las operaciones en línea //-Reutilice el registro de filas generado en este proceso en la función Registro de fila 0 :: Row_merge_read_clustered_index () y, después de atravesar el índice agrupado, asigne el trx_id del nuevo índice al ID de transacción más grande en el registro de filas en línea. Una vez creado un índice, todas las transacciones inferiores a este ID de transacción no pueden utilizar el nuevo índice. Al leer datos a través de un índice agrupado, se lee la última versión del registro. ¿Este registro también existirá en el registro de filas? ¿Cómo maneja InnoDB esta situación? En primer lugar, la respuesta es sí. Al atravesar el índice agrupado para leer las últimas versiones de los registros, estos registros pueden ser modificados/insertados por nuevas transacciones. Durante la fase de recorrido, estos registros se aplican al nuevo índice. Al mismo tiempo, las operaciones de estos registros también se registran en el registro de filas. Existe una situación en la que existe un registro en el nuevo índice y también existe en el registro de filas. Por supuesto, InnoDB también tiene en cuenta esta cuestión. Durante el proceso de reproducción del registro de filas, para cada registro en el registro de filas, primero determine si ya existe en el nuevo índice (Registro de fila 0. c::Row _ Log _ apply _ op _ low()). Si es así, se puede omitir el registro de línea actual (o se puede convertir el tipo de operación). Por ejemplo, las operaciones de inserción se registran en el registro de filas. Si ya hay registros insertados en el nuevo índice, puede descartar directamente los registros en el registro de filas (si los elementos existentes son exactamente los mismos que los elementos insertados o convertir INSERT en una operación ACTUALIZAR (los registros de filas lo son); diferente de los registros en el nuevo índice y el índice parcial Las columnas también son diferentes); ¿hay algún error al agregar índices en línea? La respuesta es sí, hay un error.

¿Es necesario crear un índice en línea? Hay tres formas de agregar índices en diferentes versiones de MySQL: (1) Copiar la tabla, que es la primera forma de crear índices admitidos por InnoDB. Como sugiere el nombre, la creación de índices se logra copiando una tabla temporal. Cree una nueva tabla temporal con el nuevo índice, copie todos los datos de la tabla original a la tabla temporal y luego cámbiele el nombre para completar la operación de creación del índice. Este método crea un índice mientras la tabla original es legible. Pero consumirá el doble de espacio de almacenamiento. (2) Modo local Este es MySQL nativo 5::MySQL _ alter _ table(); // Determina si la operación actual se puede implementar en el lugar. Las que no se pueden cambiar en el lugar son ://1: :add _ index() ...//Crear la fila 0 del diccionario de datos de índice merge::wait _ while _ table _ is _ used() //Después de crear el índice, realice la limpieza final::MySQL _ alter _ table(); //1: :row_log_allocate();row_log_t*log=(row_log_t*)&buf[2*SRV_sort_buf_size];// Indica que el estado actual del índice es creación en línea, luego // La operación DML en El índice se escribirá en el registro de filas sin actualizar dict_index_set_Online_status(index, Online_index_creation);...//3::row_merge en el índice _build_index();...//Después de las operaciones de lectura, clasificación e inserción del nuevo Se completa el índice agrupado // Ingrese la diferencia real entre Online e Inplace. También es la esencia de las operaciones en línea //-Reutilice el registro de filas generado en este proceso en la función Registro de fila 0 :: Row_merge_read_clustered_index () y, después de atravesar el índice agrupado, asigne el trx_id del nuevo índice al ID de transacción más grande en el registro de filas en línea. Una vez creado un índice, todas las transacciones inferiores a este ID de transacción no pueden utilizar el nuevo índice. Al leer datos a través de un índice agrupado, se lee la última versión del registro. ¿Este registro también existirá en el registro de filas? ¿Cómo maneja InnoDB esta situación? En primer lugar, la respuesta es sí. Al atravesar el índice agrupado para leer las últimas versiones de los registros, estos registros pueden ser modificados/insertados por nuevas transacciones. Durante la fase de recorrido, estos registros se aplican al nuevo índice. Al mismo tiempo, las operaciones de estos registros también se registran en el registro de filas. Existe una situación en la que existe un registro en el nuevo índice y también existe en el registro de filas. Por supuesto, InnoDB también tiene en cuenta esta cuestión. Durante el proceso de reproducción del registro de filas, para cada registro en el registro de filas, primero determine si ya existe en el nuevo índice (Registro de fila 0. c::Row _ Log _ apply _ op _ low()). Si es así, se puede omitir el registro de línea actual (o se puede convertir el tipo de operación). Por ejemplo, las operaciones de inserción se registran en el registro de filas. Si ya hay registros insertados en el nuevo índice, puede descartar directamente los registros en el registro de filas (si los elementos existentes son exactamente los mismos que los elementos insertados o convertir INSERT en una operación ACTUALIZAR (los registros de filas lo son); diferente de los registros en el nuevo índice y el índice parcial Las columnas también son diferentes); ¿hay algún error al agregar índices en línea? La respuesta es sí, hay un error.

Hay un error, el plan de reproducción es el siguiente: crear tableta 1 (a int clave primaria, b int, c char (250)) motor = innodb insertar t1 (b, c) valor (1, 'aaaaaaaa'); // Garantía de datos La cantidad es suficiente para insertar T1 (b, C) para seleccionar B, C de T1; insertar t1 (b, c) para seleccionar b, c de t1; c de t1;... // max(a) = 196591 select max(a) de t1; // b tampoco tiene elementos idénticos update t 1 set b = a; _ t 1 _ b(b) ; Inserte el valor de t1(b, c) (196592, 'b'); //Esta actualización generará duplicados con b = 196589, actualizará T1set B = 196589 donde A = 196582 eliminará de t1; donde a = 262127; en la prueba anterior, primero se preparan datos suficientes para la tabla. El propósito es que la sesión 1 pueda realizar la fase de lectura de la adición del índice en línea y también se puedan leer los nuevos registros de la sesión 2. Una vez completada (exitosa) la adición del índice en línea de la sesión 1, ejecute los siguientes dos comandos y los resultados serán los siguientes: mysql & gt muestra la tabla creada t 1 +——————————Table Create Table+; ———————— ————T 1 crea la tabla ` t 1 `( ` a ` int(11)NOT NULL AUTO _ INCREMENT, ` b` int (11) por defecto es NULL, ` c` char ( 250) por defecto es NULL seleccione * de t1 donde a In (196582, 196589);+——————+Este error se debe al proceso de reproducción del procesamiento de registros de filas sin considerar todas las situaciones en detalle, así que utilícelo con precaución Antes de que la versión de MySQL sea estable, hay dos funciones de operación de archivos en MySQL 5.6.7: una es la función posix_fadvise (), que especifica el parámetro POSIX_FADV_DONTNEED para lograr lectura y escritura sin caché: mejorar el rendimiento de Linux al conservar el estado del caché del búfer. en Linux sin almacenamiento en búfer de E/S, la función allocate() especifica el parámetro FALLOC_FL_PUNCH_HOLE, que se puede leer en: Manual del programador de Linux asignar (2) Los amigos con necesidades similares pueden probar la función Posix_fadvise + parámetro POSIX_FADV_DONTNEED. para descartar bloques de archivos limpios en el caché, si el usuario no quiere que un determinado archivo ocupe demasiado del caché del sistema de archivos, puede llamar a fdatasync() periódicamente y luego borrar los bloques limpios del archivo en el caché de acuerdo. a POSIX_fadv_Dontneed (POSIX_fadv_Dontneed)