优化Mysql导入sql文件慢问题

优化方向:

1、调整参数innodb_flush_log_at_trx_commit,默认值1
  此参数用于控制redo日志写入log file以及落盘时机。
  0:log buffer每秒一次写入log file中,并且让数据落盘。
  1:每次提交事务都会把log buffer的数据写入log file中,并且让数据落盘。
  2:每次提交事务都会把log buffer的数据写入log file中,每秒让数据落盘。

2、关闭binlog,避免生成二进制日志文件
3、在开启binlog的情况下,优化方案
  1)调整sync_binlog,默认值1
    该参数控制binlog同步磁盘的时机,
    0:不会主从将binlog同步磁盘,而是依赖操作系统来刷新binlog。
    n(n>0):每写n次二进制日志时,将其同步到磁盘。

  2)关闭sql_log_bin
    set sql_log_bin=0;

实验思路:

  控制单个变量的变化,每种情况测试3次,取平均值。

准备实验数据:

  准备数据:准备test库数据进行导入操作

  不修改任何参数进行导入:
  第一次测试:55s
  在这里插入图片描述

  第二次测试:55s
  在这里插入图片描述
  第三次测试:
  在这里插入图片描述
  平均耗时:55s

实验一:调整redo数据落盘时机为0

  set global innodb_flush_log_at_trx_commit = 0;

  第一次测试:54s
  在这里插入图片描述
  第二次测试:54s
  在这里插入图片描述
  第三次测试:53s
  在这里插入图片描述
  平均耗时:54s

实验二:调整redo数据落盘时机为2

  set global innodb_flush_log_at_trx_commit = 2;

  第一次测试:53s
  在这里插入图片描述

  第二次测试:54s
  在这里插入图片描述

  第三次测试:53s
  在这里插入图片描述

  平均耗时:53s

实验三:关闭binlog

  Mysql配置文件中增加skip-log-bin参数,重启mysql服务

  第一次测试:53s
  在这里插入图片描述
  第二次测试:53s
  在这里插入图片描述
  第三次测试:51s
  在这里插入图片描述
  平均耗时:52 s

实验四:开启binlog情况下设置sql_log_bin参数

  set sql_log_bin =0;

  第一次测试:50s
  在这里插入图片描述
  第二次测试:50s
  在这里插入图片描述
  第三次测试:50s
  在这里插入图片描述
  平均耗时:50s

实验五:设置sync_binlog参数

  set global sync_binlog = 2000;

  第一次测试:54s
  在这里插入图片描述
  第二次测试:52s
  在这里插入图片描述
  第三次测试:53s
  在这里插入图片描述
  平均耗时:53s

实验六:设置sql_log_bin参数下确定sync_binlog是否有影响

  set sql_log_bin =0;
  set global sync_binlog = 2000;

  第一次测试:51s
  在这里插入图片描述
  第二次测试:51s
  在这里插入图片描述
  第三次测试:51s
  在这里插入图片描述
  平均耗时:51s

	与实验四相比耗时增加1s,没有任何优化,因此判定在关闭binlog情况下, sync_binlog对于性能优化无任何增长,甚至可能会拖慢性能。

结论:

  开启binlog情况下两种优化方案:
    1)innodb_flush_log_at_trx_commit设置为2 + sync_binlog设置一定数量
    2)innodb_flush_log_at_trx_commit设置为2 +sql_log_bin设置为0

  未开启binlog情况下优化方案:
    innodb_flush_log_at_trx_commit设置为2

  最优方案:
    开启binlog+innodb_flush_log_at_trx_commit设置为2 +sql_log_bin设置为0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用JDBC API连接到MySQL数据库,并且通过执行SQL语句来实现数据库的导入和导出。下面是一个简单的示例代码,演示如何将MySQL数据库导出为SQL文件: ``` import java.io.FileWriter; import java.io.IOException; import java.sql.*; public class MySQLExport { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "password"; String filePath = "mydatabase.sql"; try (Connection connection = DriverManager.getConnection(url, user, password)) { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SHOW TABLES"); FileWriter writer = new FileWriter(filePath); while (resultSet.next()) { String tableName = resultSet.getString(1); writer.write("DROP TABLE IF EXISTS " + tableName + ";\n"); writer.write("CREATE TABLE " + tableName + " (\n"); ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { String columnName = metaData.getColumnName(i); String columnType = metaData.getColumnTypeName(i); writer.write(" " + columnName + " " + columnType); if (i < columnCount) { writer.write(","); } writer.write("\n"); } writer.write(");\n\n"); ResultSet dataResultSet = statement.executeQuery("SELECT * FROM " + tableName); while (dataResultSet.next()) { writer.write("INSERT INTO " + tableName + " VALUES ("); for (int i = 1; i <= columnCount; i++) { Object value = dataResultSet.getObject(i); if (value == null) { writer.write("NULL"); } else if (value instanceof String) { writer.write("'" + value + "'"); } else { writer.write(value.toString()); } if (i < columnCount) { writer.write(","); } } writer.write(");\n"); } writer.write("\n"); } System.out.println("Database exported to " + filePath); writer.close(); resultSet.close(); statement.close(); } catch (SQLException | IOException e) { e.printStackTrace(); } } } ``` 该示例代码假设数据库名称为“mydatabase”,用户名为“root”,密码为“password”,并将导出的SQL文件保存在当前目录下的“mydatabase.sql文件中。 需要注意的是,这只是一个简单的示例代码,您需要根据自己的实际情况进行修改和优化。例如,如果您的数据库包含大量数据,那么将它们全部读取到内存中可能会导致内存不足。在这种情况下,您可能需要使用分页查询或其他技术来逐步读取和导出数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值