Tengo un volcado de SQL, es bastante grande (411 MB) y tardé 10 minutos en importar en el servidor A, la misma importación en mi estación de trabajo B tiene un estimado (visor de tuberías) de 8 horas para importar (importó 31 MB en 40 minutos ) Entonces este es el factor 53 más lento.
Las especificaciones:
Server A:
MySQL Version: 5.5.30-1.1 (Debian)
2 GB RAM
1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020
Workstation B:
MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
14 GB RAM
4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000
La configuración mysql / maria es la configuración estándar.
Ayer cambié a MariaDB en mi estación de trabajo, pero antes de MariaDB las estadísticas eran aún peores.
Ya eliminé todas las bases de datos en mi estación de trabajo, no hay diferencia.
La gran pregunta es: ¿cómo puede el rendimiento ser un factor 53 más lento? No puedo trabajar así :-(
Mi comando de importación:
pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'
iostat -xm 5
servidor A:
avg-cpu: %user %nice %system %iowait %steal %idle
17,43 0,00 30,28 51,85 0,00 0,44
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0,00 254,03 0,00 1305,45 0,00 6,09 9,56 0,78 0,60 0,00 0,60 0,57 74,25
estación de trabajo B:
avg-cpu: %user %nice %system %iowait %steal %idle
7,32 0,00 3,22 5,03 0,00 84,42
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0,00 1,40 0,80 172,40 0,00 0,56 6,72 1,17 6,75 12,00 6,72 5,40 93,52
dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
servidor A:
1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s
estación de trabajo B:
1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s
fuente
innodb_buffer_pool_size
en cada máquina?Respuestas:
Esta respuesta aceleró mucho todo:
/programming//a/2167641/292408
Yo simplemente
al principio y
al final.
Ahora tomó 3 minutos.
(Cortesía de @andreasemer a través de twitter)
fuente
Complementando lo que veo arriba ... Tengo mi archivo de volcado ya generado automáticamente por algo como:
Quiero automatizar este importación así que creé dos archivos en el ordenador llamadas
default-start-import.sql
ydefault-end-import.sql
y sus contenidos son por defecto de principio import.sql :y default-end-import.sql :
y el script que ejecuto es algo como esto;
mismo comando pero más fácil de leer:
En este caso
cat
se usa para concatenar esos archivos antes de enviarlos a la tubería. Creo que es importante que todos los archivos terminen con un carácter de nueva línea (una línea vacía al final del archivo si se ve desde un editor de texto) para que elcat
comando no combine líneas entre archivos.La importación funciona bien, no he probado si en realidad es más rápida debido a esta mejora en la cosa de habilitar y deshabilitar la confirmación automática, pero si eso hace que las cosas sean más rápidas, estos pasos adicionales lo hacen más fácil.
fuente
Lo he intentado
--compress
tan bienSET autocommit=0;
y sin embargo ayudaron un poco ...Descubrí que convertir múltiples
INSERT INTO ...
declaraciones en una declaración grande conVALUES(...), (...)
velocidad mejorada múltiple considerablemente.Estoy usando
mysql
sobre SSL sobre WAN. La base de datos remota de MySQL está alojada en Amazon.Con 9 columnas y 2,100 filas:
INSERT
declaraciones separadas : 82sINSERT
estados consolidados : <1sCon 7 columnas y 42,000 filas:
INSERT
declaraciones separadas : 1,740sINSERT
estado consolidado : 105sEntonces, dependiendo de la herramienta que genera el volcado de la base de datos (o más específicamente el formato de las
INSERT
declaraciones), la velocidad puede verse influenciada.Nota: Esto también disminuye el
.sql
archivo de volcado en más del 60% en mis pruebas, por lo que también se guardará en E / S.Advertencia: existen limitaciones físicas para esta técnica con
mysql
y para aquellos que necesitan portabilidad ... SQL Server parece estar limitado a solo 1,000 filas a la vez.Aún así, ¡hacer 1,000 filas a la vez por 42,000 filas aún produce una mejora del 1,657%!
fuente