Actualmente estoy trabajando en la creación de un entorno para probar el rendimiento de una aplicación; yo estoy probando con MySQL InnoDB y para averiguar lo que puede servir mejor a nosotros. Dentro de este entorno, vamos a preparar automáticamente la base de datos (carga existente vertederos) y el instrumento de nuestras herramientas de prueba.

Me estoy preparando para la prueba de la misma volcado de datos con MySQL y InnoDB, pero ya estoy al no incorporar a la importación inicial a una velocidad utilizable para la InnoDB parte. La inicial de volcado tomó más tiempo, pero eso no me interesa, sin embargo:

$ for i in testdb_myisam testdb_innodb; do time mysqldump --extended-insert $i > $i.sql; done

real    0m38.152s
user    0m8.381s
sys     0m2.612s

real    1m16.665s
user    0m6.600s
sys     0m2.552s

Sin embargo, la importación de los tiempos eran muy diferentes:

$ for i in  testdb_myisam testdb_innodb; do time mysql $i < $i.sql; done

real    2m52.821s
user    0m10.505s
sys     0m1.252s

real    87m36.586s
user    0m10.637s
sys     0m1.208s

Después de la investigación que me llegó a través de Cambio de las tablas de MyISAM a InnoDB hacer que el sistema sea lento y, a continuación, utiliza set global innodb_flush_log_at_trx_commit=2:

$ time mysql testdb_innodb < testdb_innodb.sql

real    64m8.348s
user    0m10.533s
sys     0m1.152s

Mi humilde opinión, todavía terriblemente lenta. También he deshabilitado log_bin para estas pruebas y aquí está una lista de todas las variables de mysql.

¿ He de aceptar este largo InnoDB veces o pueden ser mejoradas? He de control total a través de este servidor de MySQL, ya que es puramente para este entorno de pruebas.

Puedo aplicar configuraciones especiales sólo para la importación inicial y volver a cambiarlos para aplicaciones de pruebas para que coincidan mejor con los entornos de producción.

Actualización:

Dado los comentarios, he deshabilitado autocommit y los diferentes controles:

$ time ( echo "SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;" \
; cat testdb_innodb.sql ; echo "COMMIT;" ) | mysql testdb_innodb;date

real    47m59.019s
user    0m10.665s
sys     0m2.896s

La velocidad se ha mejorado, pero no tanto. Es mi prueba defectuosa?

Actualización 2:

Yo era capaz de obtener acceso a un equipo diferente fueron las importaciones sólo tomó alrededor de 8 minutos. He comparado las configuraciones y aplica los siguientes valores para mi instalación de MySQL:

innodb_additional_mem_pool_size = 20971520
innodb_buffer_pool_size = 536870912
innodb_file_per_table
innodb_log_buffer_size = 8388608
join_buffer_size = 67104768
max_allowed_packet = 5241856
max_binlog_size = 1073741824
max_heap_table_size = 41943040
query_cache_limit = 10485760
query_cache_size = 157286400
read_buffer_size = 20967424
sort_buffer_size = 67108856
table_cache = 256
thread_cache_size = 128
thread_stack = 327680
tmp_table_size = 41943040

Con estos valores ahora estoy abajo a cerca de 25 minutos. Todavía muy lejos de los pocos minutos que MyISAM toma, pero es más útil para mí.

  • Sabes qué? Que realmente debería haber movido este a serverfault. Votó a favor de hacer eso. La buena suerte.
  • Suena razonable. Hay algo de mi parte puedo/debo hacer?
InformationsquelleAutor mark | 2010-01-30

4 Comentarios

  1. 126

    Intenta la Granel Carga de Datos de Consejos de la InnoDB Rendimiento Sugerencias De Optimización (especialmente la primera):

    • Al importar los datos en InnoDB, asegúrese de que MySQL no tiene
      el modo de confirmación automática habilitada debido a que
      requiere un registro de descarga a un disco para cada
      inserte. Para desactivar la confirmación automática durante
      su operación de importación, la rodean
      con SET autocommit y COMMIT
      instrucciones:

      SET autocommit=0;
      ... SQL import statements ...
      COMMIT;

      Si utiliza el mysqldump opción --opt, consigue los archivos de volcado de que se
      rápido a la importación en un InnoDB tabla,
      incluso sin el embalaje de ellas con el
      SET autocommit y COMMIT
      las declaraciones.

    • Si usted tiene UNIQUE restricciones de claves secundarias, se puede acelerar la tabla
      las importaciones por desactivar temporalmente el
      la singularidad de control durante la importación
      sesión:

      SET unique_checks=0;
      ... SQL import statements ...
      SET unique_checks=1;

      Para tablas grandes, esto ahorra una gran cantidad de e/S de disco porque InnoDB puede utilizar
      su insertar buffer para escribir secundaria
      índice de registros en un lote. De ser cierto
      que los datos no contiene duplicados
      teclas.

    • Si usted tiene FOREIGN KEY restricciones en las tablas, puede
      la velocidad de la tabla de importaciones girando el
      clave externa cheques de descuento para el
      duración de la sesión de importación:

      SET foreign_key_checks=0;
      ... SQL import statements ...
      SET foreign_key_checks=1;

      Para tablas grandes, esto puede ahorrar un montón de disco I/O.

    De la OMI, el capítulo entero, vale la pena leer.

    • Masiva +1. La respuesta perfecta.
    • Gracias por ese puntero! He ido a través del capítulo, se citó a las partes más importantes ya que de todos modos, y aplicada y de ellos corrió la prueba de nuevo. Más rápido, pero todavía de forma más lenta. No puedo creer que. Parece que me estoy haciendo un verdadero principiante error aquí.
    • Eres bienvenido. Pero en realidad, sin una confirmación automática, sin la singularidad de los cheques, sin la comprobación de claves foráneas, usted debe obtener la siguiente velocidad. ¿Tienes algún índice en la tabla? Tal vez quitarlos y volver a ellos después de la importación masiva.
    • Sí, las tablas tienen indicies, especialmente los más grandes. Voy a ver cómo puedo hacer eso.
    • He vertido con --opt opción. Volcado de tamaño de 700 mb. Ahora Importar su toma mucho tiempo. 20 minutos de partido. Todavía su importación!!!
    • Al parecer --opt es el predeterminado, por lo menos en 10.13 (de mysql 5.5.31).
    • Trató todos estos, pero la importación de un archivo de 4 mb todavía tardó 10 minutos. Off.
    • Es allí una manera de agregar el contenedor de líneas a ~1G sql archivos de volcado? Tengo muchos de estos archivos de gran tamaño.
    • He creado los archivos before y after y lo envolvió con: cat before <(pv my_large_dump.gz | gunzip) after | mysql -uroot -p dbname espero que ayude a alguien
    • slick truco @snapfractalpop

  2. 5

    Has probado a iniciar una transacción en el momento inicial y el momento de comprometerse en la final? Desde el pregunta vinculada: «Modificar la Inserción de Datos paso para iniciar una transacción en el inicio y la confirma en el extremo. Usted conseguirá una mejora, te lo garantizo.»

    Recordar que InnoDB es transaccional MyISAM no lo es. Transaccional motores de tratar a cada declaración como una transacción individual si no explícitamente el control de la transacción. Esto puede ser costoso.

    • +1 también, porque usted señaló lo correcto
    • Ahora he actualizado a la pregunta con autocommit está explícitamente desactivado. Corrió más rápido, pero aún así tarda demasiado (en mi humilde opinión).
  3. 1

    Tuve problemas haciendo un montón de importar de forma masiva y recomendar la aceptación de la respuesta. He encontrado también puede acelerar significativamente por:

    1. Caída de todos los índices (aparte de la clave primaria), la carga de los datos, a continuación, vuelva a agregar los índices
    2. La comprobación de su innodb_log_file_size * innodb_log_files_in_group es suficiente para evitar la escritura en el disco en menos de un segundo la frecuencia

    Respecto a #2 los valores predeterminados de 5M * 2 no será suficiente en un sistema moderno. Para más detalles, ver innodb_log_file_size y innodb_log_files_in_group

Dejar respuesta

Please enter your comment!
Please enter your name here