如果您主要有MyISAM表,则应增加大容量插入缓冲区。这是MySQL文档关于设置bulk_insert_buffer_size的内容:
MyISAM使用特殊的树状缓存,以在向非空添加数据时更快地执行INSERT ... SELECT,INSERT ... VALUES(...),(...),...和LOAD DATA INFILE的批量插入表。此变量限制每个线程中缓存树的大小(以字节为单位)。将其设置为0将禁用此优化。默认值为8MB。
您需要做两件事
1)将其添加到/etc/my.cnf
[mysqld]
bulk_insert_buffer_size=512M
2)为其设置全局值
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
如果您没有权限全局设置bulk_insert_buffer_size,请执行此操作
service mysql restart
当然,这不适用于InnoDB。
从另一个角度来看,无论表是InnoDB还是MyISAM,如果索引大于表,则索引可能过多。我通常认为,重新加载MyISAM mysqldump所需的时间应该是mysqldump生成时间的3倍。我还希望一个InnoDB mysqldump的重装时间应该是mysqldump制作时间的4倍。
如果您超过了4:1的比例来重新加载mysqldump,则肯定存在以下两个问题之一:
您可以使用以下存储引擎来衡量数据的大小:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
查看索引是否几乎与数据一样大甚至更大
您也可以考虑禁用二进制日志记录,如下所示:
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
重新加载脚本之前